If statement 在DO循环中继续搜索

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=

我编写了一个简单的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)。如何修改它以计算最大除数


非常感谢

您可以继续使用
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如何将其合并到我的简单代码中?有什么建议吗?我想到了!但这又是如何融入到我的代码中的呢?我指的是需要的具体变化。