1

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

提前谢谢了!

4

2 回答 2

2

你可以一直使用i, 直到你的if-statement 是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
于 2013-10-07T08:51:57.187 回答
1

你要找的是最大公约数。你可以这样做:

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

于 2013-10-07T08:52:47.317 回答