《编程之美》第2.7节:最大公约数问题
方法一:辗转相除法。
方法二:不断相减法:为了避免进行求余运算。
方法三:不断提出公约数2,如果没有公约数2,则两个数中偶数/2变成奇数,如果二者都为奇数,则进行方法2的运算。
#include<iostream>
using namespace std;
int gcd1(int x,int y)
{
if(x<y)
return gcd1(y,x);
while(y)
{
int temp=y;
y=x%y;
x=temp;
}
return x;
}
int gcd2(int x,int y)
{
if(x<y)
return gcd2(y,x);
while(y)
{
if(x-y>y)
x=x-y;
else
{
int temp=x;
x=y;
y=temp-y;
}
}
return x;
}
int gcd3(int x,int y)
{
if(x<y)
return gcd3(y,x);
int result=1;
while(y)
{
if((x&1)==0)
{
if((y&1)==0)
{
x>>=1;
y>>=1;
result<<=1;
}
else
x>>=1;
}
else
{
if((y&1)==0)
y>>=1;
else
{
if(x-y>y)
x=x-y;
else
{
int temp=x;
x=y;
y=temp-y;
}
}
}
}
return result*x;
}
int main()
{
const int x=60,y=120;
cout<<gcd1(x,y)<<endl;
cout<<gcd2(x,y)<<endl;
cout<<gcd3(x,y)<<endl;
system("pause");
return 0;
}