问题描述:
给一个整数,请输出该数字阶乘的后缀0的个数,例如:
数字7,它的阶乘为5040,后面有一个0,则输出1;还有数字10,它的阶乘为3628800,后面有两个0,则输出2。
/*
功能:求一个整数的阶乘含有多少个0
如 5! = 120(1个0)
8! = 40320(1个0)
10! = 3628800(2个0)
15! = 1307674368000(3个0)
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
int sum(int n)
{
int c = 0;
while(n >= 5)
{
c += fun(n);
n--;
}
return c;
}
/*
功能: 求n是5的多少次幂
返回值:n是5的整数次幂(如i),则返回i;否则返回0
*/
int fun(int n) // 返回n是5的多少次幂
{
int i = 0;
while(n >= 5)
{
if(n % 5 == 0)
{
n /= 5;
i++;
}
else
break;
}
return i;
}
int main()
{
int n = 30;
while(n >= 1)
{
printf("sum(%d) = %d\n", n, sum(n));
n--;
}
return 0;
}
编译运行:
[zcm@t #179]$make
gcc -g -c -o a.o a.c
gcc -g -o a a.o -lm
[zcm@t #180]$./a
sum(30) = 7
sum(29) = 6
sum(28) = 6
sum(27) = 6
sum(26) = 6
sum(25) = 6
sum(24) = 4
sum(23) = 4
sum(22) = 4
sum(21) = 4
sum(20) = 4
sum(19) = 3
sum(18) = 3
sum(17) = 3
sum(16) = 3
sum(15) = 3
sum(14) = 2
sum(13) = 2
sum(12) = 2
sum(11) = 2
sum(10) = 2
sum(9) = 1
sum(8) = 1
sum(7) = 1
sum(6) = 1
sum(5) = 1
sum(4) = 0
sum(3) = 0
sum(2) = 0
sum(1) = 0
[zcm@t #181]$
网上一位牛人写了一个更加简洁的自算法,把我的sum()和fun()合并到了一个函数f(),如下:
int f(unsigned int n)
{
if (n < 5) {
return 0;
}
return n / 5 + f(n / 5);
}