leetcode 172 题解及感想

leetcode遇到此题,明白直接求n!是不行的,必然会导致溢出。转变思想之后,发现n=n x (n-1) x (n-2) x ... x10 x 9 x ... x 2,只要书橱,这里面因子5和因子2的个数,就知道了零的个数了。又由于因子2的个数远大于因子5的个数,因此,只需要数出因子5的个数即可。而因子5的个数,刚好是n中包含5的个数,加上包含25的个数,再加上包含125的个数一直加到5^[log5(n)]时构思以下代码

#include
#include

int main()
{
    int n;
    scanf("%d", &n);
    int  count=0;
    int factor =5;
    while(n >= factor)
    {

        count += n/factor;
        factor *= 5;
    }
}

上述代码在n较小时,结果正确,而在n=1808548329时,结果错误。在 debug之后发现存在溢出,如下图所示

leetcode 172 题解及感想_第1张图片
image.png

当把 factor类型改为 long long时,以上问题得到解决。
在提交之后,发现一种更好的代码的实现

#include
#include

int main()
{
    int n;
    scanf("%d", &n);
    int  count=0;
    while(n)
    {
        count += n/5;
        n/=5;
    }
    printf("%d\n",count);
}

这种方法使用除法运算代替了乘法运算,保证了运算过程不会发生溢出。
通过这个问题的求解,似乎可以得到以下结论:

  • 不加限制的连续乘法会导致溢出,可以想办法将乘法运算转变为除法运算。

你可能感兴趣的:(leetcode 172 题解及感想)