我正在尝试创建一个while循环,遍历每个可能的长数,并将它遇到的每个素数加到primes数组中。由于while循环应该运行直到primes的长度为200,我希望primes数组用前200个素数填充。相反,我得到全部为零。我已经成功获得了20行10个字符,每个字符之间有一个空格。我怎么能让它们成为实际的素数呢?
public class PrimeGenerator {
public static void main(String[] args) {
long primes[] = new long[200];
while (primes.length > 200){
for(long y = 2; y < Long.MAX_VALUE; y++) {
int primeCounter = 0;
if (isPrime(y) == true){
primes[primeCounter] = y;
primeCounter++;
}
}
}
for (int i = 0; i < 20; i++) {
int primeCounter = 0;
for(int p = 0; p < 10; p++) {
System.out.print(primes[primeCounter] + " ");
primeCounter++;
}
System.out.println();
}
}
public static boolean isPrime(long number) {
if (number % 2 == 0)
return false;
if (number == 2)
return true;
for(int x = 3; x*x <= number; x+=2) {
if (number%x == 0)
return false;
}
return true;
}
}
答案 0 :(得分:1)
primes.length
始终为200,因此永远不会输入while
循环。
while
循环没用。只需向for
循环添加一个条件,该循环将在分配整个数组时退出。同时将primeCounter
的初始化移到for
循环之外。否则,所有素数将被分配到primes[0]
。
long primes[] = new long[200];
int primeCounter = 0;
for(long y = 2; y < Long.MAX_VALUE && primeCounter < 200; y++) {
if (isPrime(y) == true){
primes[primeCounter] = y;
primeCounter++;
}
}
for (int i = 0; i < primes.length; i++) {
System.out.print(primes[i]);
if ((i+1) % 10 == 0)
System.out.println();
}
编辑:
正如Sweeper评论的那样,您还应修正isPrime
方法,因为它会为false
返回2
:
public static boolean isPrime(long number) {
if (number == 2)
return true;
if (number % 2 == 0)
return false;
for(int x = 3; x*x <= number; x+=2) {
if (number%x == 0)
return false;
}
return true;
}
答案 1 :(得分:0)
这段代码
long primes[] = new long[200];
while (primes.length > 200){
表示
while (200 > 200){
或与
相同while (false){
所以你的循环永远不会被执行!
答案 2 :(得分:0)
因为你做了:
while (primes.length > 200)
并且数组的长度总是200,你永远不会进入while循环,并且数组中的零值即将到来,因为当你创建“long”数组时,它用零初始化了它
答案 3 :(得分:0)
首先,数组的长度不会改变。因此,当您测试primes.length > 200
时,这将始终为false,并且永远不会输入循环。因此,数组中的所有值都保留为默认值0
。
为此,我会做类似以下的事情:
int primeCounter = 0;
long current = 0L;
while(primeCounter < primes.length){
if(isPrime(current)){
primes[primeCounter] = current;
primeCounter++;
}
current++;
}
答案 4 :(得分:0)
数组的长度永远不会改变。如果你声明一个数组的长度为200,那么它的长度总是200.因此,你的while循环永远不会执行,甚至不会执行一次。
代码中还有很多其他错误,因此我尝试使用尽可能少的更改创建解决方案:
public static void main(String[] args) {
int primeCounter = 0;
long nextPossiblePrime = 2;
long primes[] = new long[200];
while (primeCounter < 200) {
for (long y = nextPossiblePrime; y < Long.MAX_VALUE; y++) {
if (isPrime(y) == true) {
primes[primeCounter] = y;
primeCounter++;
nextPossiblePrime = y + 1;
break;
}
}
}
primeCounter = 0;
for (int i = 0; i < 20; i++) {
for (int p = 0; p < 10; p++) {
System.out.print(primes[primeCounter] + " ");
primeCounter++;
}
System.out.println();
}
}
public static boolean isPrime(long number) {
if (number == 2 || number == 3)
return true;
if (number % 2 == 0)
return false;
for (int x = 3; x * x <= number; x += 2) {
if (number % x == 0)
return false;
}
return true;
}
第一个问题是你创建了两个primeCounter
,这是不需要的。我删除了额外的一个并将其范围移到了方法的范围内。接下来的问题是你的第一个for循环不记得它所在的素数,当它找到它时它不会停止,所以它会继续向数组添加第200个素数。我通过添加一个nextPossiblePrime
变量来修复此问题,该变量存储了程序接下来要检查的数字。最后一个问题是您的isPrime
方法写得不正确。我为你修好了!
这是另一个(更干净的)解决方案,它仍使用while循环:
public static void main(String[] args) {
ArrayList<Long> primes = new ArrayList<>();
long y = 2;
while (y < Long.MAX_VALUE && primes.size() < 200) {
if (isPrime(y) == true){
primes.add(y);
}
y++;
}
for (int i = 0; i < primes.size(); i++) {
System.out.print(primes.get(i) + " ");
if ((i+1) % 10 == 0)
System.out.println();
}
}
public static boolean isPrime(long number) {
if (number == 2 || number == 3)
return true;
if (number % 2 == 0)
return false;
for (int x = 3; x * x <= number; x += 2) {
if (number % x == 0)
return false;
}
return true;
}