版权声明:本文为博主原创文章,未经博主允许不得转载。 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 的个数。剩下的循环依次类推了。
算法学习并不是完全为了面试,对程序员的编码能力提升也是很大的,近期将不断学习和分享一些算法博客,现有需求的朋友欢迎查看博主“算法分类”中相关内容。