1. 程式人生 > >hdu2028求最小公倍數(歐幾裏得)

hdu2028求最小公倍數(歐幾裏得)

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(int
a,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; }
View Code

歐幾裏得證明:

歐幾裏德算法又稱輾轉相除法,用於計算兩個整數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求最小公倍數(歐幾裏得)