项目Euler#10 Java解决方案无法正常工作
我试图找到素数<2,000,000的总和。 这是我在Java中的解决方案,但我似乎无法得到正确的答案。 请对可能出现的错误提供一些意见,并对该代码的一般建议表示赞赏。
打印’sum’给出:1308111344,这是不正确的。
编辑:感谢您的帮助。 将int更改为long和<to <=并且它完美无缺,除了是找到素数的低效方法:)
/* The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million. */ class Helper{ public void run(){ Integer sum = 0; for(int i = 2; i < 2000000; i++){ if(isPrime(i)) sum += i; } System.out.println(sum); } private boolean isPrime(int nr){ if(nr == 2) return true; else if(nr == 1) return false; if(nr % 2 == 0) return false; for(int i = 3; i < Math.sqrt(nr); i += 2){ if(nr % i == 0) return false; } return true; } } class Problem{ public static void main(String[] args){ Helper p = new Helper(); p.run(); } }
结果将太大而无法放入整数,因此您将获得溢出 。 尝试使用BigInteger或long 。 在这种情况下,长就足够了。
你将那些只能被平方根整除的数字(如25)视为素数。 而不是i < Math.sqrt(nr)
尝试i <= Math.sqrt(nr)
。
顺便提一下,这是找到素数的一种非常低效的方法。
你的isPrime不适用于正方形。 isPrime(9)返回true。
如前所述,错误有两个:
- 你使用了一个不足以容纳这笔金额的
int
..你应该用了long
- 你使用
<
而不是<=
,这是一个错误的守卫
除了你正在做的事情是非常低效的,没有深入这类算法(如Miller-Rabin测试),我建议你去看看Eratosthenes的Sieve ..一个很老的方法教会如何以简单的方式处理复杂的问题,通过记忆的权衡来提高优雅和效率。
它真的很敏锐:它会跟踪每个素数的boolean
值,如果该数字是素数,则会断言。 然后从第一个素数开始,它排除了通过乘以正在分析另一个数的素数而获得的所有连续数。 更多的是,它需要检查更少的数字(因为它已经排除了它们)
代码很简单(只是动态编写,没有检查):
boolean[] numbers = new boolean[2000000]; long sum = 0; for (int i = 0; i < numbers.length; ++i) numbers[i] = true; for (int i = 2; i < numbers.length; ++i) if (!numbers[i]) continue; else { int j = i + i; while (j < 2000000) { numbers[j] = false; j += i; } } for (int i = 2; i < 2000000; ++i) sum += numbers[i] ? i : 0; System.out.println(sum);
当然这种方法仍然不适合高数字(因为它必须找到所有以前的素数而且因为记忆)但是这是初学者思考问题的一个很好的例子。
通过有效地使用Sieve of Eratosthenes ,我解决了问题,这是我的代码
public class SumOfPrime { static void findSum() { long i=3; long sum=0; int count=0; boolean[] array = new boolean[2000000]; for(long j=0;j
而输出是
Sum=142913828922 Count=148933 Time for execution=2360ms
如果您有疑问,请告诉我们
这是我的解决方案
public class ProjectEuler { public static boolean isPrime(int i) { if (i < 2) { return false; } else if (i % 2 == 0 && i != 2) { return false; } else { for (int j = 3; j <= Math.sqrt(i); j = j + 2) { if (i % j == 0) { return false; } } return true; } } public static long sumOfAllPrime(int number){ long sum = 2; for (int i = 3; i <= number; i += 2) { if (isPrime(i)) { sum += i; } } return sum; } /** * @param args */ public static void main(String[] args) { System.out.println(sumOfAllPrime(2000000)); } }
- 有关Spring web.xml 和标记的一些信息(参考Hello World示例)
- 将ActionListener添加到JMenuItem
- java – MySql中的Multipile更新语句
- 如何使用Mockito在模拟对象上设置属性?
- 套接字,BufferedReader.readline() – 为什么流没有准备好?
- java中的java.sql.SQLException:org.apache.thrift.transport.TTransportException?
- 配置CMake C ++ / Java项目以使用Eclipse
- Java Util Logger写同步
- 自定义HTTP消息转换器未使用,415 Unsupproted媒体类型