运行最大公约数的常用算法,并进行程序的调式与测试,要求程序设计风格良好,并添加异常处理模块(如输入非法等)
#include<stdio.h>
#include<Windows.h>
#include<time.h>
#include<math.h>
//方法1:辗转相除法
int gcd(int a,int b)
{
if(a%b==0)
return b;
else
gcd(b,a%b);
}
//方法2:穷举法
int divisor(int a,int b){
for(int i=b;i>0;i--){
if(a%i==0&&b%i==0)
return i;
}
}
//方法3: 更相减损法
int sub(int m,int n)
{
int p=0,temp,x; /*定义变量*/
while(m%2==0 && n%2==0) /*通过p的值判断m和n能被多少个2整除*/
{
m/=2;
n/=2;
p+=1;
}
if(m<n) /*m保存大的值*/
{
temp=m;
m=n;
n=temp;
}
while(x)/*x!==0时执行循环*/
{
x=m-n;
m=(n>x)?n:x;
n=(n<x)?n:x;
if(n==(m-n))/*循环直到所得的减数和差相等为止*/
break;
}
if(p==0)
return n;
else
return (int )pow(2,p)*n;/*用pow函数,计算2的p次幂,再与第二步的最终减数相乘得到最大公约数*/
}
//方法4:Stein算法函数
int stein( int x, int y)
{
int factor = 0;
int temp;
if ( x < y )
{
temp = x;
x = y;
y= temp;
}
if( 0 == 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()
{
clock_t start,finish;
double duration;
int t1,t2,i,j,k; /*定义整型变量*/
int a[10],b[10]; /*定义两个一位数组*/
printf("请先输入10个整数:\n"); /*提示输入十个整数*/
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
printf("\n");
printf("请再输入对应计算的10个整数:\n"); /*提示输入十个整数*/
for(j=0;j<=9;j++)
scanf("%d",&b[j]);
printf("\n");
start = clock();
for(i=0,j=0;i<=9,j<=9;i++,j++) /*通过for循环计算出10组的最大公约数和最小公倍数*/
{
t1=gcd(a[i],b[j]); /*自定义主调函数*/
printf("第%d组最大公约数为:%d\n",i+1,t1); /*输出每组最大公约数*/
printf("第%d组最小公倍数为:%d\n",i+1,a[i]*b[j]/t1); /*输出每组最小公倍数*/
}
finish = clock();
duration = (double)(finish - start)/ CLOCKS_PER_SEC;
printf("辗转相除法使用时间为%5.4f seconds\n",duration );/*设置输出时间为四位小数*/
start = clock();
for(i=0,j=0;i<=9,j<=9;i++,j++) /*通过for循环计算出10组的最大公约数和最小公倍数*/
{
t1=stein(a[i],b[j]); /*自定义主调函数*/
printf("第%d组最大公约数为:%d\n",i+1,t1); /*输出每组最大公约数*/
printf("第%d组最小公倍数为:%d\n",i+1,a[i]*b[j]/t1); /*输出每组最小公倍数*/
}
finish = clock();
duration = (double)(finish - start)/ CLOCKS_PER_SEC;
printf("Stein函数使用时间为%5.4f seconds\n",duration );/*设置输出时间为四位小数*/
start = clock();
for(i=0,j=0;i<=9,j<=9;i++,j++) /*通过for循环计算出10组的最大公约数和最小公倍数*/
{
t1=divisor(a[i],b[j]); /*自定义主调函数*/
printf("第%d组最大公约数为:%d\n",i+1,t1); /*输出每组最大公约数*/
printf("第%d组最小公倍数为:%d\n",i+1,a[i]*b[j]/t1); /*输出每组最小公倍数*/
}
finish = clock();
duration = (double)(finish - start)/ CLOCKS_PER_SEC;
printf("穷举法使用时间为%5.4f seconds\n",duration );/*设置输出时间为四位小数*/
start= clock();
for(i=0,j=0;i<=9,j<=9;i++,j++) /*通过for循环计算出10组的最大公约数和最小公倍数*/
{
t1=gcd(a[i],b[j]); /*自定义主调函数*/
printf("第%d组最大公约数为:%d\n",i+1,t1); /*输出每组最大公约数*/
}
finish= clock();
duration= (double)(finish - start) / CLOCKS_PER_SEC;
printf("使用时间为%5.4f seconds\n",duration );/*设置输出时间为四位小数*/
getchar();
}