回 帖 发 新 帖 刷新版面

主题:菜鸟请教求3个数的最小公倍数的算法

现有求2个数a和b最大公约数q,则这2个数的最小公倍数s可通过s=a*b/q来求。请问,现在如果已知3个数a、b和c的最大公约数q,能不能根据这个q来求这3个数的最小公倍数呢?应该怎么来算呢?[em10]
谢谢指点~~~~

回复列表 (共5个回复)

沙发

q*(a/q)*(b/q)*(c/q)=a*b*c/(q*q)

因为q是最大公约数 所以a/q, b/q, c/q互为质数

所以把三个互质数乘起来再乘上公约数就是了

好像这样不行哦。

直接穷举把

do i=max(a,b,c) to a*b*c
   if(i mod a =0 and i mod b=0 and i mod c=0)
      exit do
   end 

loop

板凳

得考虑三个数为互质的情况和三个数不为互质的情况哦~~比如:2,3,7和2,4,8

3 楼

对啊 所以说穷举 条件不够

4 楼

能不能用递归来做呢?

5 楼

先找出两数最小公倍数,再与第三个数算最小公倍数不行吗?

新建一模块,粘贴以下代码:
[code=c]
'交换两个数
Private Sub swap(a As Long, b As Long)
    Dim temp As Long
    temp = a
    a = b
    b = temp
End Sub

'计算最大公约数
Function gcd(ByVal a As Long, ByVal b As Long) As Long
    '检查参数
    Debug.Assert (a > 0)
    Debug.Assert (b > 0)
    
    '按从大到小排序
    If a < b Then swap a, b
    
    '循环取余
    Do Until b = 0
        Dim r As Long
        r = a Mod b
        a = b
        b = r
    Loop
    
    gcd = a
End Function

'计算最小公倍数
Function lcm(ByVal a As Long, ByVal b As Long) As Long
    '检查参数
    Debug.Assert (a > 0)
    Debug.Assert (b > 0)
    
    lcm = a * b \ gcd(a, b)
End Function


'计算最小公倍数
Function lcm3(ByVal a As Long, ByVal b As Long, ByVal c As Long) As Long
    '检查参数
    Debug.Assert (a > 0)
    Debug.Assert (b > 0)
    Debug.Assert (c > 0)
    
    lcm3 = lcm(lcm(a, b), c)
End Function
[/code]

Ctrl + G, 调出"立即"窗口,自己测试一下函数:
[quote]
?lcm3(1, 2, 3)
 6 
?lcm3(100, 200, 300)
 600 
?lcm3(2, 3, 12)
 12 
?lcm3(2, 3, 7)
 42 
[/quote]
参考:
[quote]
[url]http://zh.wikipedia.org/zh-cn/%E6%9C%80%E5%A4%A7%E5%85%AC%E5%9B%A0%E6%95%B8[/url]
[url]http://zh.wikipedia.org/zh-cn/%E6%9C%80%E5%B0%8F%E5%85%AC%E5%80%8D%E6%95%B8[/url]
[url]http://zh.wikipedia.org/zh-cn/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95[/url]
[/quote]

我来回复

您尚未登录,请登录后再回复。点此登录或注册