求最大公约数的几种方法的比较(C语言版)
方法一:
#include<stdio.h>
int main()
{
int a,b;
a=17*15;
b=17*23;
int i;
for(i=a;i>=1;i--) if(a%i==0&&b%i==0)
{
printf("%d",i);
break;
}
}
方法二:
//辗转相除法求最大公约数
#include<stdio.h>
void f(int m,int n)
{
if(m%n==0) printf("ans=%d",n);
else f(n,m%n);
}
int main()
{
int m=17*15,n=17*23;
f(m,n);
}
方法二PRO:
//辗转相除法求最大公约数
#include<stdio.h>
int min(int a,int b)
{
int min=b;
if(a<b) min=a;
return min;
}
int max(int a,int b)
{
int max=a;
if(a<b) max=b;
return max;
}
void f(int m,int n)
{
if(m%n==0) printf("ans=%d",n);
else f(n,m%n);
}
int main()
{
int m=17*15,n=17*23;
f(max(m,n),min(m,n));
}
方法三:
#include<stdio.h>
int main()
{
int a,b,r;
a=17*15;
b=17*23;
while(b!=0)
{
r=a%b;
a=b;
b=r;
}
printf("%d",a);
}
经过我的多次测试,所用时间如下:
方法1 | 方法2 | 2pro | 方法3 | |
---|---|---|---|---|
测试1 | 0.03005 | 0.02689 | 0.02324 | 0.02989 |
测试2 | 0.03685 | 0.02485 | 0.03327 | 0.02585 |
测试3 | 0.03833 | 0.02387 | 0.03206 | 0.02442 |
平均时间 | 0.035077 | 0.025203 | 0.029523 | 0.02672 |
注:表中数据为a=72821,b=322493并交换位置测试三次后的结果。
结论
所以,方法2是最有效的,其次是方法3,2Pro未免显得有些没有必要了。方法1是最接近数学的,但是对于计算机而言就有一些慢了,适用于初学者。但是,通过本次试验对比方法2与方法3,没有发现递归会对程序产生负面影响。