If statement 在DO循环中继续搜索
我编写了一个简单的FORTRAN代码,以便执行以下操作:假设我们必须使用具有公约数的整数n1和n2。例如,3和6都被3除。这是密码If statement 在DO循环中继续搜索,if-statement,fortran,fortran77,If Statement,Fortran,Fortran77,我编写了一个简单的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=
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)。如何修改它以计算最大除数
非常感谢 您可以继续使用
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
你要找的是那个。您可以这样做:
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
注意:它是用+(对于DO-WHILE构造和隐式NONE)编写的。怎么办?@Stefan如何将其合并到我的简单代码中?有什么建议吗?我想到了!但这又是如何融入到我的代码中的呢?我指的是需要的具体变化。