这里所使用的其实就是阿基里德算法,求两个数的最大公约数。
算法过程: 比如求 17与6的最大公约数
令M=17,N=6;
第一次:R=M%N=5; M=N=6; N =R=5
第二次: R=M%N = 1; M=N=5; N=R=1;
第三次: R=M%N =0, M=N=1,N=R=0。
所以结束条件为if(N==0)
返回 return M
/*
求两个数的最大公约数
*/
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void init_num(long int *x,long int *y)
{
int i;
srand( (unsigned)time( NULL ) );
for(i=0;i<65536;i++)
{
srand( (unsigned)time( NULL ) );
x[i]=rand();
srand( (unsigned)time( NULL ) );
y[i]=rand();
}
}
long int gcd_one(long int x,long int y)
{
if(y==0)
return x;
else
return gcd_one(y,x%y);
}
long int gcd_two(long int x,long int y)
{
if(y==0)
return x;
else if(x<y)
return gcd_two(y,x);
else
return gcd_two(y,x-y);
}
int IsEven(long int x) /*是偶数的话返回1*/
{
if(x&1)
return 0;
else
return 1;
}
long int gcd_three(long int x, long int y)
{
if(y==0)
return x;
else if(x<y)
return gcd_three(y,x);
else
{
if(IsEven(x))
{
if(IsEven(y))
{
return (gcd_three(x>>1, y>>1) )<<1;
}
else
{
return (gcd_three(x>>1,y) );
}
}
else
{
if(IsEven(y) )
{
return (gcd_three(x,y>>1) );
}
else
{
return (gcd_three(y,x-y) );
}
}
}
}
int main()
{
clock_t start,finish;
double difTime;
int x[65536];
int y[65536];
int i;
init_num(x,y);
start=clock();
for(i=0;i<65536;i++)
{
gcd_two(x[i],y[i]);
}
printf("gcd is %ld/n",gcd_one(x[100],y[100]));
printf("gcd is %ld/n",gcd_two(x[100],y[100]));
printf("gcd is %ld/n",gcd_three(x[100],y[100]));
finish=clock();
difTime=(double)(finish-start)/CLOCKS_PER_SEC;
printf("use %f secons/n",difTime);
return 0;
}