最大公约数简便算法_求最大公约数的4种算法

for(z=0; z<10000000; z++) 循环只是为了增加程序的运行时间,让我们体会算法的时间复杂度。

算法一:短除法

想法,采用短除法找出2个数的所有公约数,将这些公因子相乘,结果就是2个数的最大公约数。【找公因子,只能使用蛮力法】

#include

#include

void main()

{

int m=28,n=72;

int i,f=1;

int z;

clock_t start,finish;

double duration;

start= clock();

for(z=0; z<10000000; z++)

{

for(i=2;i<=m&&i<=n;)

{

while(m%i==0&&n%i==0)

{

f*=i;

m/=i;

n/=i;

}

i++;

}

}

finish=clock();

duration=(double)(finish-start)/CLOCKS_PER_SEC;

printf("time=%lf seconds\n",duration);

printf("result=%d\n",f);

}

image.png

算法二:辗转相除法

辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

#include

#include

void main()

{

int m=28,n=72;

int i,f=1;

int z;

clock_t start,finish;

double duration;

start= clock();

for(z=0; z<10000000; z++)

{

if(m

{

i=m;

m=n;

n=i;

}

i=m%n;

while(i)

{

m=n;

n=i;

i=m%n;

}

f=n;

}

finish=clock();

duration=(double)(finish-start)/CLOCKS_PER_SEC;

printf("time=%lf seconds\n",duration);

printf("result=%d\n",f);

}

time=0.037000 seconds

result=4

Press any key to continue

算法三:蛮力法,从2个公约数中较小的数开始递减,二个公约数除以它,可以同时除尽,变是最大公约数,我想的,很笨的一种。

#include

#include

void main()

{

int m=28,n=72;

int i,f=1;

int z;

clock_t start,finish;

double duration;

start= clock();

for(z=0; z<10000000; z++)

{

f=m>n?n:m;

for(i=f;i>0;i--)

{

if(m%i==0&&n%i==0)

{

f=i;

break;

}

}

}

finish=clock();

duration=(double)(finish-start)/CLOCKS_PER_SEC;

printf("time=%lf seconds\n",duration);

printf("result=%d\n",f);

}

time=0.992000 seconds

result=4

Press any key to continue

算法四:辗转相减法

辗转相减法是一种简便的求出两数最大公约数的方法。(更相减损术)辗转相减法(求最大公约数),即尼考曼彻斯法,其特色是做一系列减法,从而求得最大公约数。例如 :两个自然数35和14,用大数减去小数,(35,14)->(21,14)->(7,14),此时,7小于14,要做一次交换,把14作为被减数,即(14,7)->(7,7),再做一次相减,结果为0,这样也就求出了最大公约数7

#include

#include

void exchange(int *m,int *n);

void main()

{

int m=28,n=72;

int i,f=1;

int z;

clock_t start,finish;

double duration;

start= clock();

if(m

exchange(&m,&n);

for(z=0; z<10000000; z++)

{

i=m-n;

while(i)

{

if(i>n)

{

m=i;

}else

{

m=n;

n=i;

}

i=m-n;

}

f=m;

}

finish=clock();

duration=(double)(finish-start)/CLOCKS_PER_SEC;

printf("time=%lf seconds\n",duration);

printf("result=%d\n",f);

}

void exchange(int *m,int *n)

{

int temp;

temp=*m;

*m=*n;

*n=temp;

}

time=0.020000 seconds

result=4

Press any key to continue

看看4个算法的运行时间,还是我自己想的算法时间最久,来一个

大神拯救我吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值