2013-10-07 53 views
1

我編寫了一個簡單的FORTRAN代碼,以執行以下操作:假設我們必須具有共同除數的整數n1和n2。例如3和6都除以3.這裏是代碼在DO循環內繼續搜索

PROGRAM test 

INTEGER i,n1,n2 

WRITE(*,*)' Please enter two numbers: ' 
READ(*,*)n1,n2 

DO i=2,10,1 
    IF(MOD(n1,i).EQ.0.AND.MOD(n2,i).EQ.0)THEN 
    n1=n1/i 
    n2=n2/i 
    ENDIF 
    n1=n1 
    n2=n2 
ENDDO 

WRITE(*,*)n1,n2 

PAUSE 

END  

這對工作正常的例子(3,6)。然而,像(4,8)這樣的情況,其中數字具有多於一個公約數,在這種情況下是2和4.另一個例子(16,24)。我想計算兩個數的最大公約數,然後將它們減小(即3,6到1和2),但代碼返回第一個數(4,8返回到2,4而不是1,2)。如何修改以計算最大除數?

非常感謝提前!

+1

[Euclid算法](http://en.wikipedia.org/wiki/Euclidean_algorithm)怎麼樣? – Stefan

+0

@Stefan這怎麼可能被合併到我的簡單代碼?有什麼建議麼? –

回答

2

您可以留在i,直到您的if-陳述爲false


換句話說:

如果數字可以通過i進行劃分,然後不要馬上去i+1,而是嘗試通過i再次分裂。


編輯:我認爲最簡單的方法是使用DO WHILE -loop。要計算除數,你必須乘以你所有的i

gcd = 1 
DO i=2,10,1 
    DO WHILE (MOD(n1,i).EQ.0.AND.MOD(n2,i).EQ.0) 
    n1=n1/i 
    n2=n2/i 
    gcd = gcd * i 
    ENDDO 
ENDDO 
WRITE(*,*) gcd 
+0

我想到了!但是,又如何將這些結合到我的代碼中呢?我的意思是需要的具體變化。 –

+0

謝謝!它工作正常。 –

1

你在找什麼是greatest common divisor。你可以這樣做:

function gcd(a, b) 
    implicit none 
    integer a, b, aa, bb, cc, gcd 

    aa = abs(a) 
    bb = abs(b) 
    do while (bb .ne. 0) 
     cc = mod(aa, bb) 
     aa = bb 
     bb = cc 
    end do 
    gcd = aa 
end 

注:這是寫在Fortran 77 + MIL-STD-1753(對於DO WHILE結構和隱含NONE)。