最大公因數(歐幾里得算法)


    設兩數為a、b(a>b),求a和b最大公因數(a,b)的步驟如下:

    用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,則(a,b)=b;若r1≠0,則再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,則(a,b)=r1,若r2≠0,則繼續用r1除以r2,……如此下去,直到能整除為止。其最后一個為被除數的余數的除數即為(a, b)。
    例如:a=25,b=15,a/b=1......10,b/10=1......5,10/5=2.......0,最后一個為被除數余數的除數就是5,5就是所求最大公因數。

C++程序:

#include<iostream>
using namespace std;

int gcd(int a,int b) //歐幾里得算法即展轉相除法
{
    int t=a%b;
    while(t!=0) //可用裝逼寫法while(t)
    {
        a=b;
        b=t;
        t=a%b;
    }

    return b;

}


int main()
{
    freopen("p.in","r",stdin);
    freopen("p.out","w",stdout); //文件的輸入與輸出
    int a,b;
    cin>>a>>b;
    cout<<gcd(a,b)<<endl; //直接調用函數

return 0;
}

以上為普通做法,下面采用裝逼做法,把gcd函數變成遞歸,程序如下:

#include<iostream>
using namespace std;

int gcd(int a,int b)
{

    return (b==0)?a:gcd(b,a%b);    //一條語句搞定(三元運算符)裝逼,跟上面略有不同,上面做到t=0,這里做到b=0

}


int main()
{
freopen("p.in","r",stdin);
freopen("p.out","w",stdout);  //采用文件調用,習慣且方便
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;


return 0;
}

 

備注與說明:

“ ? : ”是一個三元運算符,其構成的表達式格式為:
      <表達式1> ? <表達式2> : <表達式3>

例如:
    if (a>b) max=a;
    else     max=b;
可寫成:
    max=a>b?a:b;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM