美文网首页
leetcode 172 题解及感想

leetcode 172 题解及感想

作者: NoneLand | 来源:发表于2018-05-08 15:56 被阅读23次

    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<stdio.h>
    #include<stdlib.h>
    
    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之后发现存在溢出,如下图所示

    image.png
    当把factor类型改为long long时,以上问题得到解决。
    在提交之后,发现一种更好的代码的实现
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        int n;
        scanf("%d", &n);
        int  count=0;
        while(n)
        {
            count += n/5;
            n/=5;
        }
        printf("%d\n",count);
    }
    

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

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

    相关文章

      网友评论

          本文标题:leetcode 172 题解及感想

          本文链接:https://www.haomeiwen.com/subject/djhwrftx.html