Java——素数算法返回16
我想让这个Java程序流式处理10001个素数,但它莫名其妙地决定将16标记为素数 这里的算法只是保持一个素数的运行计数,并检查每个新的数,看看它是否可以被任何小于它的素数整除。如果不是,则将其添加到数组primes[],该数字显示在控制台上,该过程继续,直到Java——素数算法返回16,java,primes,Java,Primes,我想让这个Java程序流式处理10001个素数,但它莫名其妙地决定将16标记为素数 这里的算法只是保持一个素数的运行计数,并检查每个新的数,看看它是否可以被任何小于它的素数整除。如果不是,则将其添加到数组primes[],该数字显示在控制台上,该过程继续,直到primes[]满为止 public static void main(String[] args){ int[] primes = new int[10001]; int primeCount = 1; int t
primes[]
满为止
public static void main(String[] args){
int[] primes = new int[10001];
int primeCount = 1;
int testNumber = 3;
primes[0] = 2;
while(primeCount < 10001){
for (int i = 0; i < primeCount; i++){
if (testNumber % primes[i] == 0){
i = 0;
testNumber++;
}
}
primes[primeCount] = testNumber;
System.out.println(testNumber);
primeCount++;
testNumber++;
}
}
publicstaticvoidmain(字符串[]args){
int[]素数=新的int[10001];
int primeCount=1;
int testNumber=3;
素数[0]=2;
而(素数<10001){
对于(int i=0;i
控制台读数:
3
5
7
11
13
16
17
19
.
.
.
3.
5.
7.
11
13
16
17
19
.
.
.
除16号外,其他一切看起来都井然有序。。。有什么想法吗?你应该设置
i=-1
而不是i=0
,因为你将i
的值设置为零后会立即增加
我建议您重新思考
for
循环的工作原理。这是您程序的固定版本
public static void main(String [] args){
int[] primes = new int[10001];
int primeCount = 1;
int testNumber = 3;
primes[0] = 2;
while(primeCount < 10001){
for (int i = 0; i < primeCount; i++){
if (testNumber % primes[i] == 0){
i = -1;
testNumber++;
}
}
primes[primeCount] = testNumber;
System.out.println(testNumber);
primeCount++;
testNumber++;
}
}
publicstaticvoidmain(字符串[]args){
int[]素数=新的int[10001];
int primeCount=1;
int testNumber=3;
素数[0]=2;
而(素数<10001){
对于(int i=0;i
从软件编程的角度来看,您不应该在while循环中使用For循环。你应该循环,直到你看到它不是素数,或者你检查所有的可能性,并认为它是一个首要的COS你找不到任何分频器。因此,在更大的while中应该有一个while循环。我的意思是:
public static void main(String[] args) {
int[] primes = new int[10001];
int primeCount = 1;
int testNumber = 3;
primes[0] = 2;
while (primeCount < 10001) {
boolean isPrime = true;
int i = 0;
while (isPrime && i < primeCount) {
if (testNumber % primes[i] == 0) {
i = 0;
testNumber++;
isPrime = false;
} else {
i++;
}
}
if (isPrime) {
primes[primeCount] = testNumber;
System.out.println(testNumber);
primeCount++;
testNumber++;
}
}
}
publicstaticvoidmain(字符串[]args){
int[]素数=新的int[10001];
int primeCount=1;
int testNumber=3;
素数[0]=2;
而(素数<10001){
布尔值isPrime=true;
int i=0;
while(isPrime&&i
您是否将16与2进行对比?似乎你的代码没有检查2(质数)。听说过埃拉托斯提尼筛吗?为什么要制定一个新的、不正确的算法@krico听起来很像。我认为你们应该重新考虑算法的设计。虽然它可以工作(在设置i=-1之后),但它完全不可读。在for循环中更改i从来都不是一个好主意。这将在将来给您带来很多麻烦。如果您在for循环的内部使用变量i,并且在每个循环后都设置为递增,那么您真的不应该在循环中接触i值。这不是很好的编码。