计算n!中结尾零的个数(C++实现) 。
- #include
- /*计算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));
- }
算法思想:在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
- /*计算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));
- }