咋看这题很简单啊,其实不然哦。里面的学问大着呢。
回忆下小学数学概念:最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有约数中最大的一个。
那么,怎么求呢?手算的话很自然的想到分别列出每个数的约数,然后挑选最大的共有的。可是还有更好的办法吗?用计算机程序来算的话,怎么算呢?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) ;
}
辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数.
更相减损法,又称"等值算法"
更相减损法:也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。
其算法相当简单:
就是大数减去小数,差作为下一轮的减数,直到差与被减数相等时,被减数就是最大公约数。
至于理由哦,为什么??这个算不证自明的方法(百科说的),以后再追究吧。
如求24与15的等数,其逐步减损如下表所示: (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;
}