2013-10-04 64 views
-1

我需要創建一個發現使用這個公式兩個用戶的最大公因數進入數的程序:基本的Java:尋找最大公因式

GCD(X,Y)= GCD(說明X - Y ,y)如果x> = y且gcd(x,y)= gcd(x,yx)如果x < y。 (72,54)= gcd(72-54,54)= gcd(18,54)由於72> 54,所以我們用72-54 = 18替換72,並繼續用新的值

迭代2:gcd(18,54)= gcd(18,54-18)= gcd(18,36) 因爲18 < 54,我們用54-18 = 36代替54並繼續循環新的值

迭代3:gcd(18,36)= gcd(18,36- 18)= gcd(18,18) 由於18 < 36,我們用36-18 = 18替換36並繼續用新值

循環

迭代4:gcd(18,18)= gcd(18-18,18)= gcd(0,18)= 18 由於18> = 18,所以我們用18-18替換前18個0 = 0 既然其中一個值爲0,我們不會繼續循環 非零值18是gcd。

這裏是代碼的我到目前爲止:

enter image description here

我得到的錯誤「表達的非法的開始。」

+0

它並不需要涉及到while循環,你可以使用遞歸了。 – arshajii

+4

開始寫一些代碼...測試它...找到一個錯誤...排除故障...寫更多的代碼... – bedwyr

+1

你正在寫什麼看起來像一個遞歸函數。寫這個函數,看看它是否有效。發佈你的代碼,你得到的結果,你期望的結果。那時你會得到幫助。 – Floris

回答

1

首先在這裏你的邏輯:

do { 
    int gcd1 = (num1-num2); 
    System.out.println(gcd1 + "," + num2); 

    } 
    while (num1 != 0 && num2 != 0); 
    return 
} 

你只是打印出GCD1和NUM2不更新NUM1和NUM2。

另外想想你如何使用遞歸來解決這個問題。

如果你堅持使用一個循環,這裏的while循環邏輯:

public static int greatestCommon(int a, int b) 
     { 
      while (a != 0 && b != 0) 
      { 
       if (a >= b) 
       { 
        a = a - b; 
       } 
       else 
        b = b - a; 
      } 
      if (a == 0) return b; 
      else return a; 
     } 

注意,你不需要使用do-while循環,因爲有情況下,當你不需要的減法(如果其中一個或兩個都是0)。

+0

我需要爲此問題使用循環。 – user2799775

1

使用

Math.Max(num1, num2) - Math.Min(num1,num2) 

,而不是num1-num2

+0

非常感謝。你能告訴我我的方法有什麼問題嗎(在編輯頂部) – user2799775

+0

你爲什麼認爲它錯了? – VladL

+0

它告訴我非法開始在底部的第一個花括號的線上的表達。我相信它與return語句有關 – user2799775

0

你已經說你的第一句回答(算法):

gcd(x, y) = gcd(x – y, y) if x >= y and gcd(x, y) = gcd(x,y-x) if x < y.

因此,如何翻譯成碼?等式的左邊是你的方法原型,右手邊是你的方法體:

public static int gcd(x, y) // doesn't HAVE to be public or static 
{ 
    gcd(x – y, y) if x >= y and gcd(x, y) = gcd(x,y-x) if x < y 
} 

,但在人體內的代碼無法編譯,所以你需要重寫的身體。需要注意的是"and gcd(x, y) = ..."是方法原型的重複,因此刪除:

public static int gcd(x, y) 
{ 
    if (x >= y) 
    { 
    return ... // you fill this in 
    } 
    else if (x < y) 
    { 
    return ... // you fill this in 
    } 
} 

注意,最後的「else-IF」檢查真的是沒有必要的,但你的老師可能希望看到它。

編輯:

因爲這可能在遞歸課堂練習,考慮javax.swing.table.DefaultTableModel採取這一工作示例:

private static int gcd(int i, int j) 
{ 
    return (j == 0) ? i : gcd(j, i%j); 
} 

旁註:不要打開這,因爲這顯然是不是源自給你的算法,你的老師可能會標記錯誤。

因爲你可能沒有學到三元運算符語法,我將它改寫爲:

private static int gcd(int i, int j) 
{ 
    if (j == 0) 
    return i; 
    else 
    return gcd(j, i%j); 
} 

這是遞歸的,在某些情況下,我們可以返回一個已知值的例子,但在其他方面該方法必須用不同的一組參數再次調用自己。

編輯2:

由於需要代替遞歸一個的一個交互的方法,請記住,所有的遞歸方法可以使用迭代被重寫(即,通過循環)。

延伸閱讀:

Refactoring: Replace Recursion With Iteration

+0

Math.Max(num1,num2)-Math.Min(num1,num2)是否也能正常工作? – user2799775

+0

該聲明基本上說,'從較大的數字中減去較小的數字。我不確定那個結果會給你買什麼(提示:你不需要這樣做) – splungebob

+0

你能看到我的方法有什麼問題嗎?它給我錯誤「error class,interface,or enum expected」 – user2799775