问题描述:
给一个整数,请输出该数字阶乘的后缀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); }