首页 > 编程语言 > 详细

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

时间:2015-12-21 12:19:09      阅读:189      评论:0      收藏:0      [点我收藏+]

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

技术分享

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

原文:http://www.cnblogs.com/jjzzx/p/5062691.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!