质数检查器不工作

Prime Number checker is not working

这是一个函数的代码,如果输入为素数,则该函数应 return 为真,否则为 return 假。

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

删除 n <= y 中的等于运算符。从 2 开始你的循环。它必须是这样的。 (长 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) :在每次迭代中不必要地添加检查条件。尽量避免它。

为什么使用标志而不是直接 return 语句?只是一个偏好,直接 return 在这种情况下肯定会起作用。

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

    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 个是复合的)。
  • next 从 3 迭代到 sqrt(n),那是因为要证明一个数是 素数你不需要检查所有的分隔线(如果你不相信 我试试,如果仍然不相信使用 n/2 就足够了,但还不够 最小值)。
  • For loop pace 从 3 开始,在每次迭代中加 2,得到奇数作为 divder(我们首先检查它不是偶数)。