2016-11-17 24 views
3

我试图做一个while循环遍历每个可能的长数,并将它遇到的每个素数添加到素数组中。由于while循环应该运行直到素数的长度为200,我期望primes数组填充前200个素数。相反,我得到全零。我已经成功地获得了20行,每行10个字符,它们之间有一个空格。我怎么能让他们成为实际的素数呢?如何用while循环分配数组值?

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

我仍然得到全零。 –

+0

@ScaryWombat这也无济于事,因为'primes.length'保持不变(200)。 – Eran

回答

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(); 
} 

编辑:

由于扫地评论,你也应该解决您的isPrime的方法,因为它返回false2

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; 
} 
+0

虽然这并不打印'2'。 OP的'isPrime'也是错误的。 – Sweeper

+0

@Sweeper我没有看到'isPrime()'。我认为这是正确的。谢谢! – Eran

+0

指的是前10000个素数,她希望我得到的第一个200时,教授给了我这个链接: http://primes.utm.edu/lists/small/10000.txt 它显示为2其中一个素数,所以我将方法设置为接受2作为素数以满足分配要求。 –

0

这个代码下来

long primes[] = new long[200]; 

    while (primes.length > 200){ 

手段

while (200 > 200){ 

或相同

while (false){ 

所以你的循环从不执行!

0

,因为你做的事:

while (primes.length > 200) 

和数组的长度始终是200,你永远也进不了while循环,以及阵列中的零来了,因为当你创建数组“长”它用零初始化他

0

首先,数组的长度不变。所以,当你测试primes.length > 200时,这将永远是错误的,并且甚至从未输入循环。因此,数组中的所有值都保留默认值0

这样做我会做一些这样的:

int primeCounter = 0; 
long current = 0L; 
while(primeCounter < primes.length){ 
    if(isPrime(current)){ 
     primes[primeCounter] = current; 
     primeCounter++; 
    } 
    current++; 
} 
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 s,这是不需要。我删除了额外的一个,并将其范围移至该方法的范围。接下来的问题是你的第一个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; 


}