现在的位置: 首页 > 综合 > 正文

求一个整数的阶乘结果中后缀0的个数

2019年08月10日 ⁄ 综合 ⁄ 共 925字 ⁄ 字号 评论关闭

问题描述:

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

 

抱歉!评论已关闭.