辗转相除法与更相减损数

          已知a、b求a与b的最大公因数与最小公倍数?

先说最大公因数

  一种正常的算法是把a、b改写成多个素数的幂相乘。比如a=36和b=54,那么a=2^2*3^2,b=2^1*3^3。最大公因数就是取相同的素数的最小指数相乘,即2^1*3^2=18。亲爱的wyt理解这个就行了,下面可以不用看

  再来说说辗转相除法。它是用a、b中的大数对小数取余,再把余数和小数中的较小数取余,一直这样做,直到刚好整除,余数为0。比如36与54,先算54%36=18,再算36%18=0,结束,这里的18即为所求。 

int a,b;
int zhanzhuan(int x,int y)
{
    if(x%y==0)
        return y;
    else 
    return zhanzhuan(y,x%y);
}
int main()
{
    cin>>a>>b;
    cout<<zhanzhuan(max(a,b),min(a,b));
}
ヾ(◍°∇°◍)ノ゙

 

  然后是更相减损术,这个算法是把a、b中的大数减小数,然后把小数与差中的大数减小数,直到减到减数和差一样,此时的差即为所求。

  比如36与54,先算54-36=18,再算36-18=18,此时18=18,18就是最大公因数了。

 

int a,b;
int gengxiang(int x,int y)
{
    while(x!=y)
    {
        if(x>y)
            x=x-y;
        else
            y=y-x;
    }
    return x;
}
int main()
{
    cin>>a>>b;
    cout<<gengxiang(max(a,b),min(a,b));
}
[]~( ̄▽ ̄)~*

  这样我会的方法就没了。

然后再说最小公倍数。

  一种正常的算法是把a、b改写成多个素数的幂相乘。比如a=36和b=54,那么a=2^2*3^2,b=2^1*3^3。最小公倍数就是取所有的素数的最大指数相乘,即2^2*3^3=108。不用怀疑我就是从上面粘贴的,为什么能粘贴呢?其实看看这俩方法就可以发现,ab作为两个数,最小公倍数最大公因数一个取最大指数一个取最小指数,那么每一个数分解出的素数的幂肯定都取到两个数中了,那么就有

最小公倍数*最大公约数=a*b


这样求最小公倍数和求最大公约数就是同一个问题了,你还不会么?

猜你喜欢

转载自www.cnblogs.com/qywyt/p/9024161.html