此题是算一个数的阶乘尾部的零的数量。例如5! = 120,输出1。读题后我先想到用取余的方法计算零的方法,代码如下
long sum = 1;
long j = 10;
long a = 0;
for(long i = n; i > 0; i--)
{
sum = sum * i;
}
while(sum / j > 0)
{
if(sum % j == 0)
{
a++;
}
j = j * 10;
}
但是当阶乘大了的时候就会出错,因为阶乘计算会出现很大的数,会超过long int的长度。所以此方法适用于求阶乘比较小的数。通过学习,我明白了新方法,阶乘中要出现0,必然是5或者5的平方乘以一个偶数,所以首先要找出给出的阶乘数里有多少个5或5的平方的倍数,例如求210阶乘的0的个数,210 / 5 = 42。有21个5的倍数,但其中可能包括了25,125...等5的平方的倍数,因为8 * 5 = 40,8 * 25 = 200, 8 * 125 = 1000。有一个5,则会产生一个0。所以25,125等5的平方可以产生多个0,所以我们要在刚刚找的5的倍数中找出既是5的倍数又是25倍数的数,所以用42 / 5 = 8。有8个25的倍数,这8个数能产生2个0,所以我们把多出来0加上去。125也是一样,因为125乘以偶数可以产生比25乘以偶数所得的0还多一个,所以我们要在25的倍数里找出既是25倍数又是125的倍数的数,8/125 = 0。有0个,没有125的倍数,所以也没有比125更大的5的次方的倍数,所以210阶乘末尾的0的个数为5的倍数+25的倍数*2。所以42 + 8 = 50。有50个零。此方法代码很简单,想法比较复杂。