求最大公约数算法源代码

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int divisor(int a,int b)//辗转相除法
{
int temp;
if(a<b)
{
temp=a;a=b;b=temp;}
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return (a);
}

int divisor2(int a,int b)//穷举法
{
int temp;
temp=(a>b)?b:a;
while(temp>0)
{
if(a%temp0&&b%temp0)
break;
temp–;
}
return(temp);
}

int gcd(int m,int n)//更相减损法
{
int temp,i=0,x;
while(m%20&&n%20)
{
m/=2;
n/=2;
i+=1;
}
if(m<n)
{
temp=m;
m=n;
n=temp;
}
while(x)
{
x=m-n;
m=(n>x)?n:x;
n=(n<x)?n:x;
if(nm-n)
break;
}
if(i
0)
return n;
else
return(int)2in;
}

int Stein(unsigned int x,unsigned int y) //stein算法
{
int factor=0;
int temp;
if(x<y)
{
return 0;
}
while(x!=y)
{
if(x&0X1)
{
if(y&0x1)
{
y=(x-y)>>1;
x-=y;
}
else
{
y>>=1;
}
}
else
{
if(y&0x1)
{
x>>=1;
if(x<y)
{
temp=x;
x=y;
y=temp;
}
}
else
{
x>>=1;
y>>=1;
++factor;
}
}
}
return(x<<factor);
}

int main()
{
int m[8000],n[8000],t1,i;//定义两个数组存放数
double t;
clock_t start,end;//定义两个clock_t类型的变量计算时间
printf("\n8000组数测试:\n");
for(i=0;i<8000;i++)//循环为数组赋值
{
m[i]=55+rand()%10000;
n[i]=78+rand()%10000;

}
for(i=0;i<8000;i++)
{
t1=gcd(m[i],n[i]);
//printf(“第%4d组随机数为:%4d %4d 余数为%d\n”,i,m[i],n[i],t1);
}
//更相减损法
start=clock();
for(i=0;i<8000;i++)
{
t1=gcd(m[i],n[i]);
}
end=clock();
t=(double)(end-start)/8000;
printf(“更相减损法平均花费时间:%f毫秒\n”,t);

//辗转相除法
start=clock();
for(i=0;i<8000;i++)
{
t1=divisor(m[i],n[i]);
}
end=clock();
t=(double)(end-start)/8000;
printf(“辗转相除法平均花费时间:%f毫秒\n”,t);

//穷举法
start=clock();
for(i=0;i<8000;i++)
{
t1=divisor2(m[i],n[i]);
}
end=clock();
t=(double)(end-start)/8000;
printf(“穷举法平均花费时间:%f毫秒\n”,t);

//stein算法
start=clock();
for(i=0;i<8000;i++)
{
t1=Stein(m[i],n[i]);
}
end=clock();
t=(double)(end-start)/8000;
printf(“Stein算法平均花费时间:%f毫秒\n”,t);

//更换数组容量进行测试
printf(“80000组数:\n”);
int m1[80000],n1[80000];
for(i=0;i<80000;i++)
{
m1[i]=55+rand()%10000;
n1[i]=78+rand()%10000;
}

//更相减损法
start=clock();
for(i=0;i<80000;i++)
{
t1=gcd(m1[i],n1[i]);
}
end=clock();
t=(double)(end-start)/80000;
printf(“更相减损法平均花费时间:%f毫秒\n”,t);

//辗转相除法
start=clock();
for(i=0;i<80000;i++)
{
t1=divisor(m1[i],n1[i]);
}
end=clock();
t=(double)(end-start)/80000;
printf(“辗转相除法平均花费时间:%f毫秒\n”,t);

//穷举法
start=clock();
for(i=0;i<80000;i++)
{
t1=divisor2(m1[i],n1[i]);
}
end=clock();
t=(double)(end-start)/80000;
printf(“穷举法平均花费时间:%f毫秒\n”,t);

//stein算法
start=clock();
for(i=0;i<80000;i++)
{
t1=Stein(m1[i],n1[i]);
}
end=clock();
t=(double)(end-start)/80000;
printf(“Stein算法平均花费时间:%f毫秒\n”,t);
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43815240/article/details/88622501