簡體   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