我编写了一个简单的FORTRAN代码,以便执行以下操作:假设我们必须使用具有公约数的整数n1和n2。例如,3和6都除以3.这是代码
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)。如何修改以计算最大除数?
非常感谢提前!
答案 0 :(得分:2)
您可以使用i
,直到if
- 语句为false
。
换句话说:
如果某个号码可以除以i
,则不要立即转到i+1
,而是再次尝试除以i
。
编辑:我认为最简单的方法是使用DO WHILE
循环。要计算除数,您必须将所有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
答案 1 :(得分: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构造和IMPLICIT NONE)。