給出兩個數a、b,求最大公約數(GCD)與最小公倍數(LCM)
一、最大公約數(GCD)
最大公約數的遞歸:
* 1、若a可以整除b,則最大公約數是b
* 2、如果1不成立,最大公約數便是b與a%b的最大公約數
* 示例:求(140,21)
* 140%21 = 14
* 21%14 = 7
* 14%7 = 0
* 返回7
代碼如下,非常簡單,一行就夠了:
1 int GCD(int a,int b) 2 { 3 return a%b?GCD(b,a%b):b; 4 }
二、最小公倍數(LCM)
求出最大公約數后m后,最小公倍數就是a*b/m了,很簡單。這里做一個擴展,求1~n共n個數的最小公倍數
思路:
兩個數的情況:
設兩個數分別為a,b
先用輾轉相除法求gcd(a,b),也就是a,b的最大公約數
然后lcm(a,b)=a*b/gcd(a,b)
n個數的情況:
設n個數分別為a1,a2,……an
則先求b1=lcm(a1,a2)
再求b2=lcm(b1,a3)
b3=lcm(b2,a4)
b4=lcm(b3,a5)
……
最后求到b[n-1]就是答案
復雜度接近O(n)
代碼如下:
設兩個數分別為a,b
先用輾轉相除法求gcd(a,b),也就是a,b的最大公約數
然后lcm(a,b)=a*b/gcd(a,b)
n個數的情況:
設n個數分別為a1,a2,……an
則先求b1=lcm(a1,a2)
再求b2=lcm(b1,a3)
b3=lcm(b2,a4)
b4=lcm(b3,a5)
……
最后求到b[n-1]就是答案
復雜度接近O(n)
1 #include <iostream> 2 using namespace std; 3 int GCD(int a,int b) 4 { 5 return a%b?gcd(b,a%b):b; 6 } 7 int main() 8 { 9 10 int i,n,m,temp=0,ans=1; 11 cin >> n; 12 for (i=1; i<=n; i++) 13 { 14 temp=GCD(ans,i); 15 ans=ans*i /temp; 16 } 17 cout << ans << '\n'; 18 19 return 0; 20 }