编程之美——阶乘问题、最大公约数

问题一:正整数N!的末尾有多少个零?

           解法一:问题等价于N!因式分解中5的指数次数;

           解法二:f(n)表示正整数n因式分解中5的指数的次数,f(n!)=k+f(k!)  (k=n/5) 可证明见:http://15838341661-139-com.iteye.com/blog/1883889

                                                                            即:f(n!)=n/5+f(n/5!)=n/5+n/5^2+........

int count(int n)
{
    int ret=0;
    while(n)
    {
        ret+=n/5;
        n/=5;
    }
    return ret;
}

问题二:N!二进制表示中最低位1的位置?

int count(int n)
{
    int ret=0;
    while(n)
    {
        n>>=1;
        ++ret;
    }
    return ret;
}

 最大公约数:可使用辗转相除法或相减法计算,但是相除法计算大整数出发复杂度较高,相减法循环次数较多

                 可采用:整数a,b的最大公约数与a/q、b相同,其中q为质数,同时不被b整除,算法如下:

                            a,b为偶数,=2*f(a,b)

                            a为偶数,b为奇数,=f(a>>1,b),同a奇数,b偶数

                            a,b同为奇数,=f(b,a-b);

                 

           

posted @ 2014-08-10 12:04  chengcy  Views(246)  Comments(0)    收藏  举报