编程之美

BoP——2.2阶乘中的0个数和二进制最后一个1的位置

2017-10-14  本文已影响0人  Myth52125

这个题忘记在那里遇到过了。

题目一

方法一

先求出这个阶乘,然后在去计算尾部有多少个0就行。
但是,面试里肯定不会提。

方法二

数学的方法
所有的数,能分解出多少个5,最终就会有多少个0。
考察每一个数

int counts1(int v)
{
    int counts = 0;
    for(int i = 1;i<=v;i++)
    {
        int j = i;
        while(j%5 == 0)
        {
            counts++;
            j/=5;
        }
    }
    return counts;
}

方法三

这是一种数学的思想,先求出含有至少一个5的因数的数,在求至少含有2个5因数的个数。

int counts2(int v)
{
    int counts=0;
    while(v)
    {
        counts+=v/5;
        v/=5;
    }
    return counts;
}

题目二

最后一个是1,的位数。
和上一个题一样,多一个5因数,结尾就多一个0。
而这个题中,多一个2因数,二进制形式中就会多一个0。
和上一题的方法二同理

int counts3(int v)
{
    int counts =0;
    while(v)
    {
        //这里其实就是相当于v/2
        v>>=1;
        counts+=v;
    }
}
上一篇下一篇

猜你喜欢

热点阅读