hdu2028求最小公倍數(歐幾裏得)
阿新 • • 發佈:2018-10-04
urn class pac color mod ostream 兩個 pla spl
用到了歐幾裏得算法:
int gcd(int a,int b) { if(b==0)return a; gcd(b,a%b); }View Code
這道題強調32位int,所以兩個int相乘可能會超範圍,所以求最小公倍數時要先除再乘
代碼如下:
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; //最大公因數 int gcd(intView Codea,int b) { if(b==0)return a; gcd(b,a%b); } int main() { int n; int a,mul; while(cin>>n) { mul = 1; while(n--) { cin>>a; mul = a/gcd(a,mul)*mul;// mul = a*mul/gcd(a,mul);會超int } cout<<mul<<endl; }return 0; }
歐幾裏得證明:
歐幾裏德算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數。
基本算法:設a=qb+r,其中a,b,q,r都是整數,則gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。
證明:
a可以表示成a = kb + r,則r = a mod b
假設d是a,b的一個公約數,則有
d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公約數
假設d 是(b,a mod b)的公約數,則
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公約數
因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證
非遞歸代碼:
int gcd(int a, int b) { while(b != 0) { int r = b; b = a % b; a = r; } return a; }View Code
hdu2028求最小公倍數(歐幾裏得)