版权声明:一起学习,一起成长,欢迎关注 奔跑的犀牛先生 https://blog.csdn.net/xuemanqianshan/article/details/89193536
一 数学上的最大公约数
1.1定义:
最大公约数:也称最大公因数,最大公因子
数学上写法 (A, B)
https://baike.baidu.com/item/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%BA%A6%E6%95%B0/869308?fr=aladdin
1.2 质因数分解法
假如,求的是A和B
最大公约数= 公共质因数1 * 公共质因数2*。。。
最小公倍数= (公共质因数1 * 公共质因数2*。。。)*(A的独特质因数1*A的独特质因数2*。。。)*(B的独特质因数1*B的独特质因数2*。。。)
A*B=最大公约数*最小公倍数
1.3 短除法
实际上就是质因数分解法
1.4 辗转相除法
辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
- 除数,被除数 =余数
- 被除数,新被除数(余数)=新余数
- 新被除数,新余数 = 新新余数
- loop
- 一直到余数=0
1.5 更相减损法
出自《九章算术》
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
- 看是不是两个偶数,是则不停的/2
- 如果不都是偶数了,那么
- 减数-被减数=差
- 被减数-新被减数(差)=新差
- 新被减数-新被减数(新差)=新新差
- loop
- 一直减到 被减数=余数,停止
二 数学上的最小公倍数
2.1 定义
两个或多个整数公有的倍数叫做它们的公倍数
数学写法 [A,B]
VBA
方案1:
'这个是别人写的
Sub 最小公倍数和最大公约数()
Dim m As Integer, n As Integer
Dim m1 As Integer, n1 As Integer
Dim t As Integer
m = InputBox("输入自然数m:")
n = InputBox("输入自然数n:")
m1 = m
n1 = n
If m1 < n1 Then
m1 = n
n1 = m '交换m和n的值
End If
Do
r = m1 Mod n1
If r = 0 Then Exit Do
m1 = n1
n1 = r
Loop
str1 = m & "," & n & "的最大公约数=" & n1 & vbCrLf
str1 = str1 & "最小公倍数=" & m * n / n1
MsgBox str1
End Sub
方案2:(解决了不只2个数怎么办的问题)
http://www.excelpx.com/thread-190275-1-1.html
这上面的香川裙子,写的非常牛
最小公倍数 L.C.M=Least Common Multiple
求任意2个整数的最小公倍数 的最佳自定义函数:
Function LCM&(t1&, t2&)
If t1 Mod t2 Then LCM = LCM(t2, t1 Mod t2) Else LCM = t2
End Function
方案3:
- 我自己写了一个
- 用了已经有的轮子lcm
- 但是感觉还是得懂 lcm的原理啊,自己写个球最小公倍数的也挺好的
Sub ganzhi()
Dim x
Dim arr_tiangan(10)
Dim arr_dizhi(12)
a = 1 '运算前必须进行定义
b = 1
x = Sheets("ganzhi3").UsedRange
For i = 1 To 10
arr_tiangan(i) = Cells(1, i)
Next
For j = 1 To 12
arr_dizhi(j) = Cells(2, j)
Next
m = Application.Lcm(10, 12) '取最小公倍数
m_tiangan = m / 10
m_dizhi = m / 12
For i = 1 To m_tiangan
For j = 1 To 10
Cells(3, a) = arr_tiangan(j)
a = a + 1
Next j
Next i
For i = 1 To m_dizhi
For j = 1 To 12
Cells(4, b) = arr_dizhi(j)
b = b + 1 '这里如果继续用a a的值会继承下来?!
Next j
Next i
For i = 1 To 60
Cells(5, i) = Cells(3, i) + Cells(4, i)
Next