Java 求第10001素数
我正在进行Euler#7项目,我编码:Java 求第10001素数,java,Java,我正在进行Euler#7项目,我编码: public class Seven { public static void main(String[] args) { int i = 0; int c = 1; while (c <= 10001) { if (squareRootIsPrime(i)) { c++; } i+
public class Seven {
public static void main(String[] args) {
int i = 0;
int c = 1;
while (c <= 10001) {
if (squareRootIsPrime(i)) {
c++;
}
i++;
}
System.out.println(Math.sqrt(i));
}
public static boolean squareRootIsPrime (int n) {
int x = 0;
for (int d = 1; d <= n; d++) {
if (n % d == 0) {x += 1;}
}
if (x == 3) {
return true;
} else {
return false;
}
}
}
公共七级{
公共静态void main(字符串[]args){
int i=0;
int c=1;
而(c第10001个素数的平方刚好小于110亿。一个int可以容纳的最大值刚好超过20亿。因此变量i
在到达第10001个素数的平方之前很久就会溢出。因为那样的话,你永远看不到第10001个素数
理论上,如果您将变量i
和参数n
的类型更改为long
,这将起作用。但是如果您这样做,您将得到需要计算大约60五百万次%
操作的代码(即,6加19个零).除非你有一台速度惊人的电脑,否则这不会在你的有生之年结束
您可能需要考虑您可以使用哪些其他算法。第10001个素数的平方略低于110亿。一个int所能容纳的最大值略高于20亿。因此变量i
在到达第10001个素数的平方之前很久就会溢出。因为这样,您将永远看不到第10001个素数主要的
理论上,如果您将变量i
和参数n
的类型更改为long
,这将起作用。但是如果您这样做,您将得到需要计算大约60五百万次%
操作的代码(即,6加19个零).除非你有一台速度惊人的电脑,否则这不会在你的有生之年结束
您可能需要考虑可以使用哪些其他算法。首先,您应该将i++;
行移到if(squareRootIsPrime(i))
上方,否则您将打印实际搜索结果后面的数字的平方根
没有打印结果的原因很简单,就是计算机计算时间太长。我正在测试c首先,您应该将I++;
行移到if(squareRootIsPrime(I))
上方,否则您将打印实际搜索结果后面的数字的平方根
你没有打印出结果的原因很简单,就是计算机计算时间太长。我正在测试c10001st素数仅为104743
您可以将代码更改为:
public class Seven {
public static void main(String[] args) {
int i = 0;
int c = 1;
while (c <= 10001) {
if (IsPrime(i)) {
c++;
System.out.println(i);
}
i++;
}
System.out.println(i);
}
public static boolean IsPrime(long x) {
if (x<2) return false;
if (x<=3) return true;
for (long j = 2; j <= Math.sqrt(x) + 1; ++ j)
if (x % j == 0) return false;
return true;
}
公共七级{
公共静态void main(字符串[]args){
int i=0;
int c=1;
而(c10001素数仅为104743
您可以将代码更改为:
public class Seven {
public static void main(String[] args) {
int i = 0;
int c = 1;
while (c <= 10001) {
if (IsPrime(i)) {
c++;
System.out.println(i);
}
i++;
}
System.out.println(i);
}
public static boolean IsPrime(long x) {
if (x<2) return false;
if (x<=3) return true;
for (long j = 2; j <= Math.sqrt(x) + 1; ++ j)
if (x % j == 0) return false;
return true;
}
公共七级{
公共静态void main(字符串[]args){
int i=0;
int c=1;
虽然(c)即使将10001
更改为10
它调用此函数超过800次,也不确定Fibonacci与任何事情有何关系。此外,不需要BigInteger。被测试的数字不超过110亿,这很容易放在一个较长的范围内。@bastard24即使将10001
更改为10
它调用此函数ion超过800次不确定Fibonacci与任何事情都有什么关系。此外,不需要BigInteger。被测试的数字不超过110亿,这很容易放入一个长字符串中。@Bastard24是OP的代码,不检查a数字sqrt是否为素数。可以始终使用相同的算法,但将methods参数更改为n a增益-而不是n,我需要定义为int i=Math.sqrt(n)然后。我认为这是毫无意义的,正如我在回答中所描述的,这只是一个优化-但我明白你的意思。但是我会保持原样,因为我描述了我所做的更改。OP的代码是否没有检查a数字sqrt是否为素数?One可以始终使用相同的算法,但更改方法参数再次从er到n,而不是n,我需要定义为int i=Math.sqrt(n)。我认为这是毫无意义的,正如我在回答中所描述的,这只是一个优化,但我明白你的意思。不过我会保持原样,因为我描述了我所做的更改。