主题:菜鸟请教求3个数的最小公倍数的算法
大懒猫
[专家分:220] 发布于 2009-11-23 08:27:00
现有求2个数a和b最大公约数q,则这2个数的最小公倍数s可通过s=a*b/q来求。请问,现在如果已知3个数a、b和c的最大公约数q,能不能根据这个q来求这3个数的最小公倍数呢?应该怎么来算呢?[em10]
谢谢指点~~~~
回复列表 (共5个回复)
沙发
shenjinggege [专家分:3260] 发布于 2009-11-23 09:54:00
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
板凳
大懒猫 [专家分:220] 发布于 2009-11-23 09:59:00
得考虑三个数为互质的情况和三个数不为互质的情况哦~~比如:2,3,7和2,4,8
3 楼
shenjinggege [专家分:3260] 发布于 2009-11-23 10:15:00
对啊 所以说穷举 条件不够
4 楼
大懒猫 [专家分:220] 发布于 2009-11-23 13:05:00
能不能用递归来做呢?
5 楼
tanchuhan [专家分:15140] 发布于 2009-11-23 16:56:00
先找出两数最小公倍数,再与第三个数算最小公倍数不行吗?
新建一模块,粘贴以下代码:
[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]
我来回复