0

它现在可以找到输入范围内的所有素数,但找不到数字 2,即最小的素数。

for(int number=2;number<range;number++){
    for(int testDivide=2;testDivide<Math.sqrt(number);testDivide++){
        if(number%testDivide!=0) {
            System.out.println(number);
        }
        break;

    }

对于范围 10,它打印:5 7 9 但没有 2。

4

6 回答 6

1

您的代码没有产生正确结果(缺少 2 和 3;包括 9)的原因是您的素数测试逻辑是倒退的。如果内部循环完成而没有找到任何偶数除数,则该数是素数;相反,如果您发现任何非除数,您将打印该数字。

试试这个:

for( int number = 2; number < range; number++) {
    boolean divisible = false;
    int limit = (int) Math.sqrt(number);
    for (int testDivide = 2; !divisible && testDivide <= limit; testDivide++) {
        divisible = number % testDivide == 0;
    }
    if (!divisible) {
        System.out.println(number);
    }
}

请注意,在一个范围内生成所有素数的一种更有效的方法是Eratosthenes 的筛子

于 2013-10-09T02:40:27.557 回答
0

我认为你的 for 循环有点混乱。

for(int testDivide=2;testDivide<Math.sqrt(number);testDivide++){

}

不知道为什么当 testDivide 等于 sqrt(number) 时停止,当 testDivide 大于时应该停止。

同样在您的内部 for 循环内部也不正确:

    if(number%testDivide!=0) {
        System.out.println(number);
    }
    break;

基本上所有这些都会检查数字是否可以被2整除,然后打破。仅当您找到一个完全除法的数字时才需要中断 (number%testDivide==0)。也许保留一个布尔值,当你中断时设置为 true,如果该布尔值为 false,则仅在内部 for 循环完成后打印。

类似的东西:

    for (int number=2; number<range; number++){
        boolean found = false;
        int limit = (int)Math.sqrt(number);
        for (int testDivide=2; testDivide<=limit; testDivide++){
            if(number%testDivide==0) {
                found = true;
                break;
            }
        }   
        if (!found) System.out.println(number);
    }
于 2013-10-09T02:19:29.907 回答
0

检查这里的代码:包核心;

public class Test2 {
    public static void main(String[] args) {
        int cnt = 0;
        for (int i = 2;; i++) {
            if (Priem(i)) {
                cnt++;
                System.out.println(i);
                if (cnt == 200)
                    break;
            }
        }

    }

    public static boolean Priem(int n) {
        for (int i = 2; i < n; i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
}
于 2013-10-09T02:14:30.433 回答
0

此处重新发布代码不适合评论:

public static void main(String[] args) {
        int cnt = 0;

        for (int i = 2;; i++) {
            if(i==2){
                System.out.println(i);
                continue;
            }
            if (Priem(i)) {
                cnt++;
                System.out.println(i);
                if (cnt == 200)
                    break;
            }
        }

    }

    public static boolean Priem(int n) {
        for (int i = 2; i <Math.sqrt(n)+1; i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
于 2013-10-09T02:55:47.133 回答
0

在您的代码中,当数字为 2 时,sqrt(2)是 1.41,并且控制不会进入循环。我没有得到迭代 upto 背后的逻辑sqrt(number)。试试这个代码

public class Test {
public static void main(String[] args) {
    int range = 500; //I assume
    for (int i = 2; i< range; i++) {
        if (isPrime(i)) {
            System.out.println(i);
        }
    }

}

public static boolean isPrime(int number) {
    for (int i = 2; i <= number/2; i++) {
        if (number % i == 0) {
            return false;
        }
        if(i % 2 == 1) {
            i++;  //If not divided by 2 then
                  // need not to check for any even number
                  // Essentially incrementing i twice hereafter
        }
    }
    return true;
  }
}
于 2013-10-09T02:21:28.153 回答
0

请注意,生成素数列表的最佳方法之一是“ Sieve of Erwhatshisface ”:

创建一个从 2 开始的连续整数列表,直到您要搜索的最大数字。取列表 (2) 中的第一个非零数字,并从该位置重复执行第 2 步,将每个第二个列表元素清零。

接下来取第二个非零数 (3) 并从该位置重复执行第 3 步,归零。继续处理列表中的每个非零值,直到您处理完所有这些值(或至少进行到一半,此时您将超出列表的末尾)。

剩下的非零数都是素数。

于 2013-10-09T02:28:58.023 回答