代码没有';在Java中,不要停止运行
我正在用Java解决Euler项目中的问题10 “10以下的素数之和为2+3+5+7=17。代码没有';在Java中,不要停止运行,java,primes,Java,Primes,我正在用Java解决Euler项目中的问题10 “10以下的素数之和为2+3+5+7=17。 求出200万以下所有素数之和。” 我的代码是 package projecteuler_1; import java.math.BigInteger; import java.util.Scanner; public class ProjectEuler_1 { public static void main(String[] args) { int sum = 0, i = 2;
求出200万以下所有素数之和。” 我的代码是
package projecteuler_1;
import java.math.BigInteger;
import java.util.Scanner;
public class ProjectEuler_1 {
public static void main(String[] args) {
int sum = 0, i = 2;
while (i <= 2000000) {
if (isPrime(i)) {
sum += i;
}
i++;
}
System.out.println(sum);
}
public static boolean isPrime(int n) {
int i, res;
boolean flag = true;
for (i = 2; i <= n / 2; i++) {
res = n % i;
if (res == 0) {
flag = false;
break;
}
}
return flag;
}
}
package projecteuler\u 1;
导入java.math.biginger;
导入java.util.Scanner;
公共类项目1{
公共静态void main(字符串[]args){
整数和=0,i=2;
虽然(i通过做一个小改动,您可以极大地提高性能:
更改:
for (int i = 2; i < n; i++) {
for(int i=2;i
致:
int max=Math.sqrt(n);
对于(int i=2;i您的代码运行时间是O(n^2)
。对isPrime()
的每次调用平均是O(n)
说明:
1/2
的数字可被2整除,1/3
的数字可被3整除,1/n
的数字可被n
整除。该方法的预期运行次数将是(1-1/2)+(1-1/3)+(1-1/n)=(1+1+…+1)-(1/2+1/3+…+1/n)=n-(1-(1/2+1/3+)
第二次运行次数之和为,其和为0(logn)
,因此这将为您提供运行时间
因为这是按每个数字进行的,所以它给出了总的O(n^2)
@波西米亚式的方法改变为int max=Math.sqrt(n);
将产生O(nsqrt(n))
性能,如前所述
就时间复杂度而言,最好的方法是使用类似于的方法,这将产生O(nlogn)
时间性能,这一性能逐渐优于您的算法和优化算法,因此对于大量数据,运行速度将显著加快。代码处于O(n^2)
,它可能需要很长时间。你确定它完成了吗?它打印了什么?或者你是说它根本不打印任何东西?请先尝试一个小得多的数字-正如@rubble Mind所说,它可能需要很长时间。它一定需要很长时间。它没有给你任何结果的原因是它的优化非常糟糕。Project Euler是关于opti的将您的算法优化到需要它的问题,因此您的代码是一个太简单而无法提供解决方案的主要示例。您需要制定另一种方法,但给出它作为答案会破坏挑战。它将完成,但需要很长时间。您应该考虑一些快捷方式来加快代码的速度。例如:DoesisPrime()
必须检查下面的所有数字n
或者子集是否足够?也许您可以更早地离开该函数?等等……我很想问OP为什么要检查偶数。如果它不除以2,为什么要除以4?解决方案中还有其他问题,但我想我会留给OP去发现。@eis你也可以进行其他优化,但即使是你建议的优化也不会改变大的O数。是的,不会。但是我不认为我们应该为他解决这个问题,因为欧拉计划是关于个人学习的,真的。我认为暗示他的算法是次优的就足够了。应该是O(nsqrt(n)),而不是O(nlogn)。我在中给出了详细的推理答案。仅供参考,所述问题是它“没有停止运行”,而不是“给出错误的结果”。我相信我已按照所述回答了问题并提供了解决方案。
int max = Math.sqrt(n);
for (int i = 2; i <= max; i++) {