繁体   English   中英

素数检查器不起作用

[英]Prime Number checker is not working

这是一个函数的代码,如果输入为素数,则应返回true,否则返回false。

这就是我打算的工作方式:假设y = 7,循环从n = 1开始。 由于1(n)小于7(y),因此循环可以迭代。 程序检查y除以n是否有0的余数,这意味着n是y的因数。 如果为真,那么它将检查该因子是否等于1或y(7),因为如果它们不等于1,则意味着y除了自身和1之外还有更多因子,这意味着它不是素数,因此它应该自动结束函数并返回false。 但由于7只有两个因子1和7,并且它们等于1或自身(y),因此在循环结束后,它应该返回true。

我不明白为什么它不起作用。

    public static boolean checkIfPrime(long y) {
    for ( long n =1L; n <= y; n++) {
        if(y%n == 0) {
            if( n != 1L || n != y) { 
                return false;
            }

        }
    }
    return true;
}

经过一些优化,代码将像这样

    static boolean isPrime(long n){
    long lim = (long) Math.sqrt(n);

    if(n%2 == 0 && n != 2)
        return false;

    for (int i = 3; i <= lim; i=i+2)
        if(n%i == 0)
            return false;       
    return true;
}

这段代码:

  • 检查数字是否为偶数且与2不同(除2以外的所有偶数均为复数)。
  • 接下来从3迭代到sqrt(n),那是因为要证明一个数是质数,您不需要检查所有除法器(如果您不相信我会尝试,并且如果仍然不相信,请使用n / 2 wich是足够的,但不是最小值)。
  • 对于循环速度,从3开始并在每次迭代中加2,仅得到除数的奇数(我们首先检查了它不是偶数)。

在n <= y中删除等于运算符。 从2开始循环。它必须是这样的。 (long n = 2; n <y; n ++)

对于您要实现的目标,我认为伪代码应如下所示:

set a flag = true;

Loop from 2 to y-1{
    if(y%n==0){   
        flag = false
        break; // Very important
    }
}

check flag condition & return (if some othe computation is required) or just return flag

if(n!= 1L || n!= y):不必要在每次迭代中添加检查条件。 尽量避免它。

为什么使用标志代替直接返回语句? 只是偏爱,在这种情况下,直接回报肯定会起作用。

暂无
暂无

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

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