求两数最大公约数。算法
【思路】spa
1.常规:设求最大公约数算法为f(m,n),则f(m,n)=f(n,m%n)(m>n>0).当n==0时,返回mcode
原理:x=ky+b,则f(x,y)=f(y,b)。blog
缺点:除法或取余运算代价较大get
2.用减法替代取余。即f(m,n)=f(n,m-n)(m>n>0).class
缺点:增长了迭代次数。对于一个超大数和一个1,消耗太大。原理
3.用觉得代替除法。总结
原理:设y=k*y1, x=k*y2,则f(x,y)=k*f(x1,y1);di
若x=p*x1,p是素数,且y%p!=0(即y不能被p整除),有f(x,y)=f(p*x1, y)=f(x1,y);co
取p=2,则有三种状况:x y均为偶数;x y一偶一奇;x y均为奇数,对于第三种状况,就用思路2,用差来表示。
【codes】
//method1
int getcomdev1(int a, int b) { if(a<b) return getcomdev(b, a); return (!b)?a:getcomdev1(b, a%b); }
//method2 int getcomdev(int a, int b) { if(a<b) return getcomdev(b, a); if(b==0) return a; if(a%2==0&&b%2==0) return getcomdev(a>>1, b>>1)<<1; if(a%2==0&&b%2!=0) return getcomdev(a>>1, b); if(a%2!=0&&b%2==0) return getcomdev(a, b>>1); if(a%2!=0&&b%2!=0) return getcomdev(b,a-b); }
【总结】
1.method1的一句话代码多么简洁
2.method2的各类状况都要考虑到,与2的乘除运算所有用移位替代。