Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以找到所有素数,但不';t包括「;“2”字;?_Java - Fatal编程技术网

Java 可以找到所有素数,但不';t包括「;“2”字;?

Java 可以找到所有素数,但不';t包括「;“2”字;?,java,Java,它现在可以找到输入范围内的所有素数,但找不到数字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;

它现在可以找到输入范围内的所有素数,但找不到数字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;

    }
for(int number=2;number检查此处的代码:
包芯

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;
    }
}
公共类Test2{
公共静态void main(字符串[]args){
int-cnt=0;
for(int i=2;i++){
if(Priem(i)){
cnt++;
系统输出打印LN(i);
如果(cnt==200)
打破
}
}
}
公共静态布尔Priem(int n){
for(int i=2;i
我想你的for循环有点混乱

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

}
基本上,所有这一切都要做的是检查数字是否可以被2整除,然后断开。您只需要在找到一个可以完全除数的数字时断开(数字%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);
    }

for(int number=2;number在您的代码中,当number为2时,
sqrt(2)
为1.41,控制不进入循环。我没有得到迭代到
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;
  }
}
公共类测试{
公共静态void main(字符串[]args){
int range=500;//我假设
对于(int i=2;i对于(int i=2;i请注意,生成素数列表的最佳方法之一是“”:

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

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


剩下的非零数都是素数。

代码没有生成正确结果的原因(缺少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);
    }
}
for(int number=2;number对于(int testDivide=2;!divisible&&testDivide将代码重新发布在此处,因为它不适合于注释:

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;
    }
publicstaticvoidmain(字符串[]args){
int-cnt=0;
for(int i=2;i++){
如果(i==2){
系统输出打印LN(i);
继续;
}
if(Priem(i)){
cnt++;
系统输出打印LN(i);
如果(cnt==200)
打破
}
}
}
公共静态布尔Priem(int n){

for(inti=2;isqrt(2)~=1.414,它比2小,所以内部for循环不会执行。9不是质数。
9
不是质数……而且你缺少
3
还有点太懒了,青蛙先生:)质数是2,3,5,7,11,13,17,19,23,29,31,37……你从来没有实例化过只升到sqrt(数字)的逻辑范围如果一个数字不是素数,那么至少有一个因子小于sqrt(number)。问题不在于循环限制,而在于OP的逻辑。如果循环完成时没有整数平均除以该数字,则该数字是素数。相反,OP如果找到任何非除数,则会打印结果。对于2,逻辑不成立,因为
sqrt(2)
为1.44,小于2,因此您的内循环条件为false。@VallabhPatade-内循环逻辑完全有缺陷。逻辑应该是,如果内循环在没有找到确切的除数的情况下退出,则数字为素数。如果内循环根本不执行(如2和3的情况),则2和3将(正确)归类为素数。@TedHopp您能解释一下代码可能会失败的测试用例吗?查找x数量的素数的方法不是一种安全/智能的方法,因为这将非常占用cpu,并且会很快崩溃。我认为查找x范围内的素数是一种更好的方法。我们需要检查什么n
?检查到
n/2
也就足够了。将这一行用于(int i=2;i)仅上升到sqrt(数字)的逻辑是,如果一个数字不是素数,则至少有一个因子小于sqrt(数字)。仍然使用n/2--for(int i=2;i)仅上升到sqrt(数字)的逻辑如果一个数字不是素数,那么至少有一个因子小于sqrt(number)。我听说过这个“把戏”,但在本文中它似乎是无效的。你必须对sqrt进行四舍五入吗?不,你不必进行四舍五入。如果任何因子大于sqrt(n),那么就有一个因子小于sqrt(n)(只需将n除以大于sqrt(n)的因子即可)。如果sqrt(n)是一个整数,那么这当然可能是唯一的因子。出于谨慎考虑,需要选择sqrt(n)+epsilon的下限来防止浮点错误(我不懂数学。sqrt将精确地找到整数平方根)@TedHopp是由sqrt决定的吗?我是说@LazyFrog-Oops。它应该是

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