繁体   English   中英

如何使用while循环分配数组值?

[英]How do I assign array values with a while loop ?

我正在尝试创建一个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;


    }

}

primes.length始终为200,因此永远不会输入while循环。

while循环没用。 只需在for循环中添加一个条件,该条件将在分配整个数组时退出。 primeCounter的初始化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方法,因为它返回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;
}

这段代码

    long primes[] = new long[200]; 

    while (primes.length > 200){

手段

while (200 > 200){

或者相同的

while (false){

所以你的循环永远不会被执行!

因为你做了:

while (primes.length > 200)

并且数组的长度总是200,你永远不会进入while循环,并且数组中的零值即将到来,因为当你创建“long”数组时,它会用零初始化

首先,数组的长度不会改变。 因此,当您测试primes.length > 200这将始终为false,甚至不会输入循环。 因此,数组中的所有值都保留为默认值0

为此,我会做类似以下的事情:

int primeCounter = 0;
long current = 0L;
while(primeCounter < primes.length){
    if(isPrime(current)){
        primes[primeCounter] = current;
        primeCounter++;
    }
    current++;
}

数组的长度永远不会改变。 如果您声明一个数组的长度为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;


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM