Prime Number检查器无法正常工作

时间:2017-11-21 02:14:11

标签: java math primes prime-factoring

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

这就是我打算如何工作:假设y = 7,循环以n = 1开始。由于1(n)小于7(y),因此循环可以迭代。程序检查y除以n是否具有0的余数,这意味着n是y的因子。如果它是真的,那么它会检查该因子是否不等于1或y(7),因为如果它们不是那么这意味着y除了它的self和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;
}

3 个答案:

答案 0 :(得分:2)

通过一些优化,代码就像这样

    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就足够了但不是 最低价值)。
  • 循环速度从3开始,每次迭代加2,只得奇数作为divder(我们先检查它是不是偶数)。

答案 1 :(得分:1)

在n&lt; = y中删除等于运算符。从2开始你的循环。它必须是这样的。 (长n = 2; n

答案 2 :(得分:1)

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

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):在每次迭代中不必要地添加检查条件。尽量避免它。

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