Java 阿特金斯的筛选,意外的结果
因此,我正在研究第10题的阿特金斯筛 问题: “10以下的素数之和为2+3+5+7=17 求出200万以下所有素数之和。” 我相信我正确地遵循了这些步骤,但它没有给出正确的答案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
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)