【问题标题】:Prime Number checker is not working质数检查器不工作
【发布时间】:2017-11-21 02:14:11
【问题描述】:

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

这就是我打算让它工作的方式:假设 y = 7,循环从 n=1 开始。由于 1(n) 小于 7(y),因此循环可以迭代。程序检查 y 除以 n 的余数是否为 0,这意味着 n 是 y 的因数。如果为真,则检查因子是否不等于 1 或 y (7),因为如果它们不等于,则表示 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;
}

【问题讨论】:

  • n != 1L || n != y 只能在 y == 1L 时为假。
  • 尝试以 2 开始 for 并以 n
  • @shmosel 为什么说 shmosel,我不明白。因为如果在第一次迭代中 y = 7 n = 1 所以 y%n = 0。并且由于 n =1 这意味着 n != 1L 是错误的,这意味着 (n != 1L || n != y) 也是错误的.我的推理不正确吗?
  • @Saurabh 感谢您的意见,但您能解释一下原因吗?
  • (false || true) == true

标签: java math primes prime-factoring


【解决方案1】:

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

    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 循环速度从 3 开始,在每次迭代中加 2,仅得到奇数作为 divder(我们首先检查它不是偶数)。

【讨论】:

    【解决方案2】:

    删除 n

    【讨论】:

    • 其实你可以替换||通过 &&。
    • 问题是||条件。
    • 是的,我觉得你@Bek,shmosel 只是帮助我意识到这一点。我的想法不对。
    【解决方案3】:

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

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

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

    【讨论】:

    • 啊我真的很喜欢你的方法,我很感激你的意见。你对我的问题有什么想法吗?我知道这不是最好的,但我试图了解实际问题是什么。
    • 在你的初始版本问题是,你用一个初始化它,每 long%1 会给你== 0,一旦你更正它本来可以工作但由于循环结束条件而失败 n
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2013-08-04
    相关资源
    最近更新 更多