我一直在解决项目euler的问题,而不是使用暴力,我想用质量解决方案来解决问题。我建立了这个以找到素数,并且一直在测试它的价值。当我寻找第12个素数时,它会告诉我它的35(显然不是)。
它应该将35识别为不是素数,因为所有先前的素数都被添加到列表中,但这里出现了问题。有什么想法吗?
public static void main (String[] args) {
int nthTerm = 12;
int count = 3;
int nPrime = 3;
ArrayList<Integer> primeList = new ArrayList<>();
primeList.add(3);
int upperBoundary;
ArrayList<Integer> checkList = new ArrayList<>();
int check;
boolean isPrime;
while (count < nthTerm) {
isPrime = false;
nPrime += 2;
for (int i = 0; i < primeList.size(); i++){
upperBoundary = (int) Math.floor(Math.sqrt(nPrime));
if (primeList.get(i) <= upperBoundary){
checkList.add(primeList.get(i));
}
}
for (int j = 0; j < checkList.size(); j++){
check = checkList.get(j);
if (nPrime % check == 0){
isPrime = false;
break;
} else {
isPrime = true;
primeList.add(nPrime);
}
}
if (isPrime == true) {
count++;
}
}
System.out.println("Prime number " + count + ": " + nPrime);
}
}
答案 0 :(得分:1)
首先,您不需要在第一个for循环中重新计算upperBoundary
。该值在该循环的每次迭代中都没有变化,因此只需在while循环中计算它。
其次,对于nPrime
的低值,您不会向checkList
添加任何内容。这是根本问题。值5永远不会添加到该列表中,因此25和35都被标识为素数。
最后,您应该通过在调试器中运行代码来调试代码,或者至少在中间步骤中打印出一些值。查看算法中标识为素数的所有值以及checkList
变量中的值,可以引导您找到解决方案。
(另外,在这里发布问题时,这将有助于解释您的方法。如果有解释它的尝试,可以更容易理解代码出错的地方。)
答案 1 :(得分:0)
试试这个:
public static void main(String[] args) {
int nthTerm = 12;
int nPrime = 3;
List<Integer> primeList = new ArrayList<>();
primeList.add(2);
primeList.add(3);
while (primeList.size() < nthTerm) {
nPrime += 2;
boolean isPrime = true;
for (int primeIndex = 1; primeIndex < primeList.size(); primeIndex++) {
int prime = primeList.get(primeIndex);
if (nPrime % prime == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primeList.add(nPrime);
System.out.println("Prime number " + primeList.size() + ": " + nPrime);
}
}
System.out.println("Prime number " + nthTerm + ": " + nPrime);
}
您的代码存在问题: