辗转相除法:求a和b的最大公约数c
if(a%b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return b;
//a>=b
证明:
-
因为 a b = k … r \frac{a}{b}=k…r ba=k…r
-
所以 a = k ∗ b + r a=k*b+r a=k∗b+r
设a,b最大公约数为c,则 a = m ∗ c a=m*c a=m∗c , b = n ∗ c b=n*c b=n∗c -
所以
- m ∗ c = k ∗ n ∗ c + r m*c=k*n*c+r m∗c=k∗n∗c+r
- m ∗ c − k ∗ n ∗ c = r m*c-k*n*c=r m∗c−k∗n∗c=r
- ( m − k ∗ n ) c = r (m-k*n)c=r (m−k∗n)c=r
-
由最后一步看出 r 也是最大公约数c的倍数,
且r比a和b都要小 -
令 a=b , b=r;
再继续寻找a和b的最大公约数。 -
这样一来缩小了a,b两个数的大小
进而缩小了找最大公约数的范围 -
当a正好是b的倍数时,即a%b=0时
最大公约数就找到了,就是此时的b。
同理求最小公倍数设a和b的最小公倍数为d
- d既是a的倍数,又是b的倍数
- 且要是这些公共的倍数中最小的一个
- 在这些公倍数里面 a ∗ b a*b a∗b必然是a和b的公倍数
- 但 a ∗ b a*b a∗b并不一定是最小为什么呢?
- 因为
a
∗
b
a*b
a∗b分解等于
- ( m ∗ c ) ∗ ( n ∗ c ) (m*c) *(n*c) (m∗c)∗(n∗c) = m ∗ n ∗ c 2 m*n*c^2 m∗n∗c2
- 最小公倍数应该是 m ∗ n ∗ c m*n*c m∗n∗c (m与n与c互质)
- 这里面多乘了一个c(最大公约数)
- 所以最小公倍数 d = a ∗ b c d=\frac{a*b}{c} d=ca∗b