簡體   English   中英

最大公約數

[英]Greatest common divisor

我試圖找到兩個整數的最大公約數。 但我不明白我的代碼有什么問題:

public class Main {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        int a = s.nextInt();
        int b = s.nextInt();

        while (a != 0 | b != 0) {
            if (a >= b) {
                a = a % b;
            } else {
                b = b % a;
            }
        }

        if (a == 0) {
            System.out.println(b);
        } else {
            System.out.println(a);
        }
    }
}

只是改變

a != 0 | b != 0

a != 0 && b != 0

因為你的版本將工作,即使a或b等於0.但是你需要退出循環,當其中一個等於0. && - 更好而且因為在你的情況下你不需要檢查右手操作符,如果左邊等於0

如果我們理解核心邏輯,則更容易計算GCD。 嘗試了解我們需要做什么,以及在實施程序之前我們將如何做。

我們試圖找到的是將ab分開的最大數字。

所以問題出現了我們將如何去做。 我們像你一樣做一個循環,但對於這種情況,我們最初假設a大於b

第一步是啟動循環,而計算沒有完成。 在我們的情況下, 我們必須在兩個數字中的任何一個變為零時停止。

while (a != 0 && b != 0)
{
    // Do the calculation here.
}

現在我們必須編寫計算。 我們假設a大於b或兩者相等。

我們保持對分配除以b 余數。

while (a != 0 && b != 0)
{
    a = a % b;
}

這使解決方案只有一半正確,我們將不得不處理另一種情況,即當b大於a時 之所以出現這種情況是有的組迭代后,會變得小於b,這將導致被設置為0。

因此,當a小於b時,讓我們對另一種情況做同樣的解決方案。

while (a != 0 && b != 0)
{
    if (a > b)
        a = a % b;
    else
        b = b % a;
}

這就是你想要實現的目標。 非零值將是解決方案。

讓我們不要停在這里,看看為什么你當前的版本不起作用。 你有這個條件。

你的條件是:

 a != 0 | b != 0 

在這里,您在兩個布爾值之間使用逐位運算符OR,如下所示。 假設ab中的任何一個為零。

情況1:

 a != 0 => true b != 0 => false true | false => true 

案例2:

 a != 0 => false b != 0 => true false | true => true 

因此,正如您在上述情況中所看到的那樣,它繼續循環直到兩者都變為零,因此您將始終報告為G​​CD為零。

希望這可以幫助。

您可能需要實現Eudidean的算法(實際上是關於數學)但這里有一個例子說明這個算法是如何工作的

private static int GCD(int a, int b)
    {

        int remainder = a % b;
        while (remainder!= 0)
        {

            a = b;
            b = remainder;
            remainder = a % b;
        }

        return b;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM