题目:计算n!中结尾零的个数(C++实现) 。
当时一看到这道题目便有了思路,很快就写出了代码。我写的代码如下:
static int i=0;
int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}
/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}
算法思想:在1-10两个数相乘要产生0,只有 10×1=2×5,2×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));
}