最大公因数(Greatest Common Divisor)。多个数字共同都有的正因数当中最大的一个。
int gcd ( int a , int b )
{
int d ;
for ( d = a ; !( a % d == 0 && b % d == 0 ); d --) ;
return d ;
}
由于两个数必定是由最大公因数的整数倍所组合而成,故其差值也必定由最大公因数的整数倍所组合而成,不管两数如何辗转相减、辗转求余数,其得到的值都会是最大公因数的倍数。把最大公因数想成是万丈高楼平地起的砖块们就简单多了。
回圈版本:
// 令 a 比 b 大,比较容易思考
int gcd ( int a , int b )
{
if ( a < b ) //如果大小不对,便交换位置
return gcd ( b , a );
while ( b != 0 )
{
int t = a % b ;
a = b ; b = t ;
}
return a ; //如果比较小的数字为零,表示比较大的数字为最大公因数
}
// 其实不必侦测ab 大小,自己便会交换
int gcd ( int a , int b )
{
while ( b != 0 )
{
int t = a % b ;
a = b ; b = t ;
}
return a ;
}
另一种奇怪的回圈版本。
// b不能为零
int gcd ( int a , int b )
{
while (( a %= b ) && ( b %= a ))
/* empty */ ;
return a + b ;
}
递回版本:
// 令 a 比 b 大,比较容易思考
int gcd ( int a , int b )
{
if ( a < b ) //如果大小不对,便交换位置
return gcd ( b , a );
if ( b == 0 ) //如果比较小的数字为零,表示比较大的数字为最大公因数
return a ;
else
return gcd ( b , a % b ); //辗转相除
}
int gcd ( int a , int b )
{
if ( a < b ) return gcd ( b , a );
return b == 0 ? a : gcd ( b , a % b ); //连成一气
}
// 其实不必侦测ab 大小,自己便会交换
int gcd ( int a , int b )
{
return b == 0 ? a : gcd ( b , a % b );
}
较为常见的一种:
int gcd ( int a , int b )
{
return b ? gcd ( b , a % b ) : a ;
}
最小公倍数(Least Common Multiple)。多个数字共同都有的正倍数当中最小的一个。
int lcm ( int a , int b )
{
int m ;
for ( m = a ; !( m % a == 0 && m % b == 0 ); m ++) ;
return m ;
}
int lcm ( int a , int b , int c )
{
int m ;
for ( m = a ; !( m % a == 0 && m % b == 0 && m % c == 0 ); m ++) ;
return m ;
}
int LCM(int a,int b)
{
int temp_lcm;
temp_lcm=a*b/GCD(a,b); //最小公倍数等于两数之积除以最大公约数
return temp_lcm;
}