Java 阿特金斯的筛选,意外的结果

Java 阿特金斯的筛选,意外的结果,java,Java,因此,我正在研究第10题的阿特金斯筛 问题: “10以下的素数之和为2+3+5+7=17 求出200万以下所有素数之和。” 我相信我正确地遵循了这些步骤,但它没有给出正确的答案 import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class Level_10 { public static void main(St

因此,我正在研究第10题的阿特金斯筛

问题:

“10以下的素数之和为2+3+5+7=17

求出200万以下所有素数之和。”

我相信我正确地遵循了这些步骤,但它没有给出正确的答案

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;


public class Level_10 {
     public static void main(String[] args) {
        //Sieve of atkins
        int limit = 2000000;
        long sum = 0;
        int ins = 2;
        int limitsq = ((int)Math.round(Math.sqrt(limit)));
        ArrayList<Long> results = new ArrayList<Long>();
        //2, 3. and 5 are primes
        results.add(2L);
        results.add(3L);
        results.add(5L);
        Map<Long, Boolean> sieves = new HashMap<Long, Boolean>(); //composite list
        //adding sieves
        for (int i = 5; i <= limit; i++) sieves.put((long) i,false);

    long n;
    for (int x = 1; x < limitsq; x++) {
        for (int y = 1; y < limitsq; y++) {
            //4x^2 + y^2
            n = ((4*(x*x)) + (y*y));
            if (n <= limit && (n % 12 == 1 || n % 12 == 5)) sieves.put(n*n, true);
            //3x^2 + y^2
            n = ((3*(x*x)) + (y*y));
            if (n <= limit && (n % 12 == 7)) sieves.put(n*n, true);
            //3x^2 − y^2
            n = ((3*(x*x)) - (y*y));
            if (x > y && n <= limit && (n % 12 == 11)) sieves.put(n*n, true);

        }
    }

    //Multiple of squares are not prime
    for (int num = 1; num < limitsq; num++) {
        if (sieves.get(num) != null) for (int m = num * num; m <= limit; m += num * num) sieves.put((long) m, false);
    }

    //Add into results

        for (Entry<Long, Boolean> nextSieve : sieves.entrySet()) {
        if (nextSieve.getValue() && ins % 2 == 0) {
            results.add(nextSieve.getKey());
            ins++;
        }
    }
    //Generate the sum
    for (Long resultNum : results) sum += resultNum;

    System.out.println("The sum of all primes below " + limit + " is " + sum);

     }
}
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.Map.Entry;
公共课第10级{
公共静态void main(字符串[]args){
//阿特金斯筛
整数限值=2000000;
长和=0;
int-ins=2;
int limitsq=((int)Math.round(Math.sqrt(limit));
ArrayList结果=新建ArrayList();
//2、3和5是素数
结果:添加(2L);
结果:添加(3L);
结果:添加(5L);
Map sieves=newhashmap();//复合列表
//加筛

对于(int i=5;i Atkins的筛?是不使用任何碳水化合物的筛吗?System.out.println()你的朋友会发现代码中的真实性和你认为真实性不再相同的地方。你必须打印出你正在进行的计算的中间结果,并试图找出错误的地方。当你弄清楚它发生在哪里时,你可以继续回答为什么会发生在那里。它是否给出了正确的答案r(17)当您将限制设置为10时?@TedHopp当我将限制设置为10时,它会给我59。不过,我将遵循Gimby的建议。只是关于ur last for循环效率的提示,每次将numnum添加到m意味着它每次都必须计算num。我建议您使用:for(int m=1;m*(numnum)