求兩數最大公約數。算法
【思路】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的乘除運算所有用移位替代。