计算n!中结尾零的个数——上海先锋商泰面试归来

面试的时候问了一些C++的基础知识,然后谈谈自己最得意的项目,个人感觉没什么难度,只要基础扎实的话应该没问题。最后现场编程,下面和大家分享一下这道编程题。

题目:计算n!中结尾零的个数(C++实现) 。

#include <stdio.h>

/*计算n!结尾零的个数,返回零的个数。*/
int CalZeroNum(int n)
{
	int result=1;
	int num=0;

	/*计算n的阶乘,结果保存在result中。*/
	int i;
	for(i=n;i>=1;i--)
	       result*=i;

	/*计算result结尾零的个数*/
	while(1)
	{
		if(result%10==0)
		{
			result/=10;
			num++;
		}
		else 
			break;
	}
	return num;//返回零的个数。
}

void main()
{
	printf("10!结尾零的个数为:%d/n",CalZeroNum(10));
}

面试官看了我的代码之后有些不满意,因为这种算法存在很大问题——如果n!很大时(大于32767时),int result就无法保存n!的值,程序就无法正确执行。此外,由于需要进行多次累加和累乘运算,程序的效率也是非常低的。回到宿舍后我参考了网上大牛们的算法,最后总结了几个更好的算法解决这个问题。

 

算法思想:在1-10两个数相乘要产生0,只有 10×1=2×52×5

  200=200×199×198……×2×1=2×5×2×5×2×199…. ×2×1;可以分解为质数相乘的形式,很明显有2的个数比5的多,所以只要求出200的阶乘可分解出多少个5相乘,就可得到200的阶乘结尾的连续的零的个数.

:num=[200/5]+[200/5/5]+[200/5/5/5].

: [x]表示对x取整.

所以可以通过这个思路很容易的得到任意阶乘结尾连续的零,其示例C语言代码如下:

#include <stdio.h>

/*计算n!结尾零的个数,返回结尾零的个数。*/
int CalZeroNum(int n)
{
	int num=0;//n!结尾零的个数
	int b=1;//5的次方
	while(1)
	{
		b*=5;
		num+=n/b;
		if(b>n)
			break;
	}
	return num;//返回结尾零的个数
}

void main()
{
	printf("20!结尾零的个数为:%d/n",CalZeroNum(20));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值