1.最大公约数
此处求解最大公约数只介绍辗转相除法,网上关于辗转相除法的定理解释有很多,就不赘述了(脑子不想接受理论解释)
公式是这样的: 设较大的数为 x,较小的数为 y;
如果 x % y == 0,则 y 是最大公约数;
否则,新的 x = y,y = x % y,然后进行下一轮运算;
这里要求最大公约数为正整数,且,若 x == 0 && y == 0 时,最大公约数返回 1
在数学中,0 与 0 的公约数是没有意义的。0 与非零数的最小公约数为非零数本身。
代码如下:
int Gcd(int x, int y) //最大公约数
{
x = x >= 0 ? x : -x;
y = y >= 0 ? y : -y;
if ( 0 == y && 0 == x )
{
return 1;
}
else if ( 0 == y || 0 == x )
{
return x + y;
}
if ( x < y )
{
int t = x;
x = y;
y = t;
}
if ( 0 == x % y )
{
return y;
}
else
{
return Gcd ( y, x % y );
}
}
2.最小公倍数
(已知最大公约数函数,最小公倍数函数不是乱杀?)
用小脑瓜转转,或者拿笔列个式子:
最小公倍数 = x * y / 最大公约数
这里要求最小公倍数为非负整数,且,当 x == 0 || y = 0 时,最小公倍数返回 0。
代码如下:
int Lcm ( int x, int y ) //最小公倍数
{
x = abs ( x );
y = abs ( y );
if ( !x || !y )
{
return 0;
}
else
{
int max = x > y ? x : y;
int min = x + y - max;
return max / Gcd ( x, y ) * min;
}
}