最大公因数(欧几里得算法)

    设两数为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;

原文地址:https://www.cnblogs.com/jjzzx/p/5062691.html