解法1:辗转相除法。
代码1:
int gcd(int a,int b)
{
return (!b) ? a : gcd(b,a%b);
}
解法2:用减法替换除法。
代码2:
int gcdi(int a,int b)
{
/*guarantee that a >= b*/
if (a < b)
return gcdi(b,a);
if (b == 0)
return a;
else
return gcdi(a - b, b);
}
解法3:利用奇偶性降低复杂度。
代码3:
int gcdii(int a,int b)
{
/*guarantee that a >= b*/
if (a < b)
return gcdii(b,a);
if (b == 0)
return a;
else {
if (!(a & 0x1)){/* a is even */
if (!(b & 0x1)) /* b is even*/
return (gcdii(a >> 1,b >> 1) << 1);
else /* b is odd */
return (gcdii(a >> 1,b));
}
else { /* a is odd*/
if (!(b & 0x1)) /* b is even */
return gcdii(a,b >> 1);
else /* b is odd */
return gcdii(b,a - b);
}
}
}
测试程序:
#include <stdio.h>
#include <assert.h>
#include <time.h>
#include <unistd.h>
#include <windows.h>
#include <stdlib.h>
#include <dos.h>
int gcd(int a,int b)
{
return (!b) ? a : gcd(b,a%b);
}
int gcdi(int a,int b)
{
/*guarantee that a >= b*/
if (a < b)
return gcdi(b,a);
if (b == 0)
return a;
else
return gcdi(a - b, b);
}
int gcdii(int a,int b)
{
/*guarantee that a >= b*/
if (a < b)
return gcdii(b,a);
if (b == 0)
return a;
else {
if (!(a & 0x1)){/* a is even */
if (!(b & 0x1)) /* b is even*/
return (gcdii(a >> 1,b >> 1) << 1);
else /* b is odd */
return (gcdii(a >> 1,b));
}
else { /* a is odd*/
if (!(b & 0x1)) /* b is even */
return gcd(a,b >> 1);
else /* b is odd */
return gcd(b,a - b);
}
}
}
int main()
{
int a = 321232;
int b = 329800;
int r;
clock_t s,t;
s = clock();
r = gcd(a,b);
//Sleep(1000);
t = clock();
printf("%d\n",CLOCKS_PER_SEC);
printf("Gcd(%d,%d) = %d . Time consumed %dms . \n",a,b,gcd(a,b),t-s);
printf("Gcdi(%d,%d) = %d .\n",a,b,gcdi(a,b));
printf("Gcdii(%d,%d) = %d .\n",a,b,gcdii(a,b));
}
REF:
1,编程之美 2.7