n的阶乘结果中末尾有多少个零?

题目:n的阶乘中一共有多少个零?
解答:产生零的结果只能有一种可能性那就是2*5=10,然而n的阶乘本质上是可以拆解为很多2和5以及其他不包含2和5的乘数的积,例如5的阶乘:1*2*3*4*5=1*2*3*2*2*5。按照这个思路,将n的阶乘乘积的每一项进行拆解,看看可以拆解出多少个2和多少个5,然后取2的个数和5的个数中最小的即可。程序代码如下:

#include <stdio.h>

int compute_zero(int n)
{
	int five_count = 0;
	int two_count = 0;
	int i, temp;

	for(i = 1; i <= n; i++)
	{
		temp = i;
		while(0 == temp%2) {temp /= 2; two_count ++;}
		temp = i;
		while(0 == temp%5) {temp /= 5; five_count ++;}
	}

	return (five_count > two_count ? two_count : five_count);
}

int compute_answer(int n)
{
	int answer = 1;
	int i;

	for(i = 1; i <= n; i++)
	{
		answer *= i;
		if(answer > 10000000) /*结果中只保留最多6个0*/
		{
			answer %= 10000000;
		}
	}

	return answer;
}

int main()
{
	int n;

	printf("Please input n:");
	scanf("%d", &n);
	printf("answer is: %d.\n", compute_answer(n));
	printf("Answer has zero %d.\n", compute_zero(n));

	return 0;
}
注:实测输入25没有问题,输入的数据过大的时候,compute_answer函数的计算结果可能会出错,本身compute_answer函数的结果也限制了结果的大小主要是显示了后面的低位高位就丢弃掉了,但是根据上面分析的compute_zero结果是不会出错的,这里将两个输出来主要是做一个对比。测试的结果如下所示:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值