c语言快速求最大公约数算法,[算法]高效求最大公约数

[算法]高效求最大公约数

因式分解的问题相信大家并不陌生,

一般的求最大公约数函数可以这么写:

long max(long a, long b)

{long ma,mi;

if(a>b)ma=a,mi=b;

else ma=b,mi=a;

for(s=mi;s>1;s--)

if((mi%s==0)&&(ma%s==0))break;

return s;}

但这个算法的缺点在于如果两数的最大公约数很小但两个数都很大的时候效率不高;

如1111和2223这个算法要1111次循环后才能得到结果;

再看这个:

long max(long a,long b)

{long i,ma,mi,c=0;

if(a>b){ma=a;mi=b;}

else {ma=b;mi=a;}

i=mi;

while(i)

{i=ma%mi;

if(i>(mi/2))i=mi-i;

ma=mi;

mi=i;

c++;}

printf("c1=%ld\n",c);

return ma;}

这也是一个求最大公约数的算法;

它的思想是:

求A和B的最大公约数,假设A>B;

A/B表示成假分数的形式为N+X/B。

如果X不等于0

那A和B的最大公约数=B和X的最大公约数

如果X=0那这两个数的最大公约数就是B,

再看这个结论:X

利用上面这些结论,可以写出跌代的算法,

大家可以看代码自己研究一下:

最坏情况循环只需要执行log2(B)次,效率可以大大提高。

PS:这个算法是我昨天为了优化一个程序想到的,拿出来给大家分享一下

[此贴子已经被作者于2004-10-07 18:52:20编辑过]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值