【原创】VBA学习笔记(33)【例子】----如何求最小公倍数 和 最大公约数

版权声明:一起学习,一起成长,欢迎关注 奔跑的犀牛先生 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

猜你喜欢

转载自blog.csdn.net/xuemanqianshan/article/details/89193536