|
Sub test()
MsgBox gcd4(24, 36)
End Sub
'方法1:递归
Function gcd(a, b)
If b = 0 Then
gcd = a
Else
gcd = gcd2(b, a Mod b)
End If
End Function
'方法2:辗转相除法
Function gcd2(a, b)
Dim r
Do
r = a Mod b
a = b '本次的除数,下次是被除数
b = r '本次的余数,下次是除数
Loop Until r = 0
gcd2 = a '返回余数为0时的除数
End Function
'方法3:更相减损法
'http://baike.baidu.com/item/最大公约数
Function gcd3(a, b)
Dim i, temp
Do Until a = b
'1)任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步
If (a Mod 2 = 0) And (b Mod 2 = 0) Then
a = a / 2
b = b / 2
i = i + 1 '约简的次数
Else
If a < b Then temp = a: a = b: b = temp '确保a>b
'2)以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
a = a - b '用两数之差,替代较大的数
End If
Loop
gcd3 = IIf(i = 0, a, b * i * 2)
End Function
'方法4:直接尝试
Function gcd4(a, b)
Dim c, i
c = IIf(a < b, a, b)
For i = c To 2 Step -1
If a Mod i = 0 And b Mod i = 0 Then Exit For
Next i
gcd4 = i
End Function
方法4是照楼主的主思路写的
|
评分
-
查看全部评分
|