题目要求
可以运行最大公约数的算法,对输入进行判断,并进行四种算法效率的比较,判断哪一种算法最快。
算法构造
辗转相除法流程图:
穷举法流程图:
更相减损法流程图:
Stein算法流程图:
算法设计
效率比较代码:
#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%temp==0&&b%temp==0)
break;
temp--;
}
return(temp);
}
int gcd(int m,int n)//更相减损法
{
int temp,i=0,x;
while(m%2==0&&n%2==0)
{
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(n==m-n)
break;
}
if(i==0)
return n;
else
return(int)2*i*n;
}
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;
}
//更相减损法
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;
}
测试代码(以及输入检测):
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <time.h>
using namespace std;
int TextFun( int, int ) //所要测试的函数
{
...
return ..;
}
int main()
{
int num1,num2,i,t;
clock_t start,end;
cout<<"请输入两个数:";
cin>>num1>>num2;
if(num1>=0&&num2>=0&&num1-(int)num1==0&&num2-(int)num2==0)
{
start=clock();
t=TextFun(num1,num2);
end=clock();
cout<<"最大公约数是:"<<t<<endl;
printf("所用时间是:%f毫秒\n",(double)(end-start));
return 0;
}
else
{cout<<"输入错误!";return 0;}
}
运行结果
辗转相除法测试:
穷举法测试:
穷举法测试:
Stein算法测试:
输入检测:
四种算法效率检测