代码没有';在Java中,不要停止运行

代码没有';在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;

我正在用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;
    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的将您的算法优化到需要它的问题,因此您的代码是一个太简单而无法提供解决方案的主要示例。您需要制定另一种方法,但给出它作为答案会破坏挑战。它将完成,但需要很长时间。您应该考虑一些快捷方式来加快代码的速度。例如:Does
isPrime()
必须检查下面的所有数字
n
或者子集是否足够?也许您可以更早地离开该函数?等等……我很想问OP为什么要检查偶数。如果它不除以2,为什么要除以4?解决方案中还有其他问题,但我想我会留给OP去发现。@eis你也可以进行其他优化,但即使是你建议的优化也不会改变大的O数。是的,不会。但是我不认为我们应该为他解决这个问题,因为欧拉计划是关于个人学习的,真的。我认为暗示他的算法是次优的就足够了。应该是O(nsqrt(n)),而不是O(nlogn)。我在中给出了详细的推理答案。仅供参考,所述问题是它“没有停止运行”,而不是“给出错误的结果”。我相信我已按照所述回答了问题并提供了解决方案。
int max = Math.sqrt(n);
for (int i = 2; i <= max; i++) {