编程计算两个数的最大公约数

咋看这题很简单啊,其实不然哦。里面的学问大着呢。

回忆下小学数学概念:最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有约数中最大的一个。

那么,怎么求呢?手算的话很自然的想到分别列出每个数的约数,然后挑选最大的共有的。可是还有更好的办法吗?用计算机程序来算的话,怎么算呢?thiking。。。。

百度。。。。。

哦,原来求最大公约数有多种方法,常见的有质因数分解法、短除法辗转相除法更相减损法

其中小学时用的多是质因数分解法,而通常用的是辗转相除法更相减损法。这其中的算法原理也早有研究和被广泛应用哦。

 

辗转相除法

辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法

当两个数都较大时,采用辗转相除法比较方便.其方法是:

以大数除以小数,如果能整除,那么小数就是所求的最大公约数.否则再用小数除以余数;

再用这新除法的余数去除刚才的余数.依此类推,直到一个除法能够整除,即余数为0

这时作为除数的数就是所求的最大公约数.

有了算法思路就可以编程了:

编程代码:

// 最大公约数

int gcd ( int m,int n )

{

       inttemp;

       if(m<n) //比较交换,使得m中为较大的数

       {

              temp=m;

              m=n;

              n=temp;

       }

       if( m % n == 0)//(即求以大数m除以小数n的余数),余数为0,即退出,小数n即为所求的最大公约数

       {

           return n;

       }

       else//余数不为0,余数再作为被除数,原来的被除数n作为除数

       {

              returngcd ( n,m % n) ;//余数再做除数n,原来的被除数n变为除数

       }

}

程序可以进一步简化为:

// 最大公约数

int gcd2(int m, int n)

{

 return n == 0 ? m : gcd2(n, m % n) ;

}

  辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数.

更相减损法,又称"等值算法"

更相减损法:也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。

其算法相当简单:

就是大数减去小数,差作为下一轮的减数,直到差与被减数相等时,被减数就是最大公约数。

 

至于理由哦,为什么??这个算不证自明的方法(百科说的),以后再追究吧。

如求2415的等数,其逐步减损如下表所示: (24,15)->(9,15)->(9,6)->(3,6)->(3,3)

每次所得两数与前两数有相同的等数,两数之值逐步减少,因而到有限步后必然获得相同的两数,也即所求的等数,其理由不证自明.

有了思路就编程验证吧

//求最大公约数

int gcd1(int i,int j)

{

   while(i != j )

    {

       if(i > j)

           i = i - j;

       else

           j = j - i;

    }

   return i;

}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值