n!阶乘结尾有多少个零?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tyhaotingdege/article/details/79943258

     

        计算出n!结果后判断是不行的,结果太大会溢出。正确思路应该是去判断 n~1之间所有数的特点,这之间的所有数统称为“子值”吧。

        n! 结尾零个数的判断:(1)“子值”本身结尾的0的个数。(2)“子值”之间相乘产生的新值结尾的0个数。

        要判断上述两个条件成立:

        (1) 先试想:判断n能被5整除多少次,即n/5就好了嘛,因为这表示"子值"结尾有0 和 "子值"相乘产生0。是否可行看第二点。

        (2) 试想是正确的,但是考虑不周,其只能判断结尾产生一个0的个数,还需要考虑判断结尾产生多个0的情况。来个假设嘛,判断产生1个0的个数只要"n/5",那产生2个0是不是"n/5/5"就好呢?其实就是这么简单的。多个0便依次类推。

         代码如下:

int CountZero(int N)
{
    int ret =0;
    while(N)
    {
        ret+=N/5; 
        N/=5;
    } 
    return ret;
}

分析:上述第一次循环即是N/5,表示:“子值”结尾有1个0 或 “子值”间相乘产生的新值结尾有1个0 的个数。
第二次循环即是N/5/5,表示:“子值”结尾有2个0 或 “子值”间相乘产生的新值结尾有2个0 的个数。剩下的循环依次类推了。

        算法学习并不是完全为了面试,对程序员的编码能力提升也是很大的,近期将不断学习和分享一些算法博客,现有需求的朋友欢迎查看博主“算法分类”中相关内容。

猜你喜欢

转载自blog.csdn.net/tyhaotingdege/article/details/79943258
今日推荐