日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数论 —— 最大公约数与最小公倍数

發(fā)布時間:2025/3/17 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数论 —— 最大公约数与最小公倍数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【概念】

1.公約數(shù):有 k 個非零整數(shù)?,若?,s.t.?,則稱 d 為??的公約數(shù)。

2.最大公約數(shù):公約數(shù)中最大的一個數(shù)稱為最大公約數(shù),記為:

注:

? ① 最大公約數(shù)一定是存在的,其最小值為 1。

? ② 當(dāng) GCD=1 時,則稱這些數(shù)是互質(zhì)的。

? ③ 公約數(shù)一定是最大公約數(shù)的約數(shù)。

3.公倍數(shù):有 k 個非零整數(shù)?,若?,s.t.?,則稱 d 為??的公倍數(shù)。

4.最小公倍數(shù):公倍數(shù)中最小的一個數(shù)稱為最小公倍數(shù),記為:

注:公倍數(shù)一定是最小公倍數(shù)的倍數(shù)。

【歐幾里德算法】

歐幾里德算法又稱為輾轉(zhuǎn)相除法,用于求兩個數(shù)的最大公約數(shù),其原理為:,即:

1.實現(xiàn)

int GCD(int x,int y){if(y==0)return x;elsereturn GCD(y,x%y); }

2.二進制算法

1)原理

為提高效率,可將歐幾里德算法進行優(yōu)化,通過不斷去除因子 2 來降低常數(shù)。

  • 當(dāng) 時,
  • 當(dāng) x、y 均為偶數(shù)時,
  • 當(dāng) x 為偶數(shù),y 為奇數(shù)時,
  • 當(dāng) x 為奇數(shù),x 為偶數(shù)時,

2)實現(xiàn)

int GCD(int x,int y){if(x==0)return y;if(y==0)return x;int i,j;for(i=0;!(x&1);i++)//約去2x>>=1;for(j=0;!(y&1);j++)//約去2y>>=1;if(i>j)i=j;while(true){if(x<y){//若x<y,交換兩數(shù),保證大數(shù)在前x^=y;y^=x;x^=y;}if((x-=y)==0)//輾轉(zhuǎn)減return y<<i;while(!(x&1))//約去2x>>=1;} }

【擴展歐幾里德算法】

擴展歐幾里德算法是在已知 x、y?時,求解一組 a、b,使得

1.過程分析

設(shè)

① 當(dāng) 時,,此時?

② 當(dāng) x>y>0 時

? ? ?設(shè) ,

? ? ?由于?

? ? ?故?

? ? ?即?

? ? ?因此?

? ? ?易得??

這樣就得到了求解 、?的方法:、 的值基于 、

由于 GCD?不斷的遞歸求解,因此一定會在某時?,結(jié)束遞歸,從而得出 a、b 的值。

注:?x-[x/y]*y 即為 mod 運算,[x/y] 代表取小于 x/y 的最大整數(shù)。

2.實現(xiàn)

int Extended_GCD(int x,int y,int &a,int &b){if(y==0){a=1;b=0;return x;}int gcd=Extended_GCD(b,a%b,y,x);b-=a*(x/y);return gcd; } int main(){//形如 ax+by=GCD(x,y)int x,y,a,b;cin>>x>>y;int gcd=Extended_GCD(x,y,a,b);cout<<"GCD="<<gcd<<endl;cout<<"a="<<a<<",b="<<b<<endl;return 0; }

【最小公倍數(shù)】

定理:a、b 兩個數(shù)的最小公倍數(shù)乘以它們的最大公約數(shù)等于 a 和 b 本身的乘積。

即:

在求 LCM 時,如果將 LCM 寫成 a*b/GCD(a,b),a*b 可能會溢出,正確的方法應(yīng)該是先除后乘,即:a/GCD(a,b)*b

int GCD(int x,int y){return !y?x:GCD(y,x%y); } int LCM(int x,int y){return x/GCD(x,y)*y; }

【例題】

  • 取石子游戲(信息學(xué)奧賽一本通-T1218)(歐幾里得):點擊這里
  • 青蛙的約會(POJ-1061)(擴展歐幾里得):點擊這里
    同題:青蛙的約會(洛谷-P1516):點擊這里
  • 最大公約數(shù)和最小公倍數(shù)問題(洛谷-P1029)(LCM):點擊這里
  • LCM Walk(HDU-5584)(LCM+逆推):點擊這里
  • Happy 2006(POJ-2773)(擴展歐幾里得求互素的數(shù)):點擊這里
  • LCM Challenge(CF-236C)(三個數(shù)的最大的LCM):點擊這里
  • Faraway(HDU-6639)(思維+LCM):點擊這里
  • 總結(jié)

    以上是生活随笔為你收集整理的数论 —— 最大公约数与最小公倍数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。