求两个正整数的最大公约数
方法1、辗转相除法
int gcd(int a,int b) { if(a<b) { return gcd(b, a); } if(b==0) { return a; } return gcd(b, a%b); }
缺点;
如果该整数是大整数,那么需要频繁地去做取余运算
方法2. 用减法
gcd(x,y)=gcd(x-y,y);
int gcd(int a,int b) { if(b==0) { return a; } if(a<b) { return gcd(b, a); } return gcd(a-b, b); }
缺点:迭代次数太多,如果是f(1111111,1);就会去做很多次减法
解法3.
综合了移位运算和减法,避开了除法运算,提高了效率
int isEven(int i) { return !(i&0x01); } int gcd(int a,int b) { if(b==0) { return a; } if(a<b) { return gcd(b, a); } if (isEven(a)) { if(isEven(b)) { return gcd(a>>1,b>>1)<<1; }else { return gcd(a>>1,b); } }else { if (isEven(b)) { return gcd(a, b>>1); }else { return gcd(a-b, b); } } } int main(int argc, const char * argv[]) { int a=15; int b=20; cout<<gcd(a,b)<<endl; return 0; }