在DO循环内继续搜索

时间:2013-10-07 07:25:22

标签: 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=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)。如何修改以计算最大除数?

非常感谢提前!

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)。