Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396652
  • 博文数量: 70
  • 博客积分: 1919
  • 博客等级: 上尉
  • 技术积分: 1179
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 20:05
文章分类

全部博文(70)

文章存档

2014年(2)

2013年(29)

2012年(20)

2011年(1)

2010年(13)

2009年(5)

分类: C/C++

2013-09-30 09:13:33

求最大公约数早在300年前左右,欧几里得就在他的著作《几何原本》中给出了高效的解法--辗转相除法,但是当整数非常大的时候,对大整数而言,取模运算和除法运算是非常昂贵的开销,这将成为整个算法的瓶颈。

code:

#include
using namespace std;
//传统意义的求最大公约数
/*这里约定x比y大
原理是:
k=x/y
b=x%y
x=k*y+b;
如果一个数能同时整除x,y,则必能同时整数b,y则
f(x,y)=f(y,x%y);
f(x,y)=f(x%y,y);
*/
int GCD_tra(int a,int b){
      //9,36
      if(a==0) return b;
      if(a       return (!a)?b:GCD_tra(a%b,b); 
}
//这种算法适合于x,y相差不大的情况,如果x,y差值很大,不建议选取该种算法
/**
一个数如果能同时整数x和y,则必能同时整除x-y和y
即f(x,y)=f(y,x-y);
f(x,y)=f(x-y,y);
*/
int GCD_mod(int x,int y){
    if(x             return GCD_mod(y,x);
    }
    if(y==0) return x;
    else return GCD_mod(x-y,y);
}
int main(){
    int a,b;
    cout<<"请输入两个数a b:";
    cin>>a>>b;
    int c=GCD_tra(a,b);
    cout<     system("pause");
    return 0;   
}

阅读(783) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~