c语言中怎么得到任意整数的阶乘末尾的0的个数?

如题所述

先用for循环求阶乘;
然后用取余数的计算判断一下最后一个数字是否为0,比如97010%10,那么就是余数就是0,只要%10就行。余数为0就把他输出,不是0的不用管。也要一个循环来遍历一下。

很简单,自己写好了。
另外任意整数是不现实的,必须定义一个最大值,要不计算机会溢出的,随便给个最大值。比如99999,然后循环求从1到99999的连乘运算。最后循环用%10的方法,是0的就输出,不是0的就罢了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-30
iamxujian的已经不错了,如果把long 改成unsigned __int64支持的范围能更大
恩恩,程序差不多了 ,我就给你说下这个算法的原理:
如果想在末尾凑成个0 那么就相当于乘以个10 而10可以分解为2x5
所以说只要把N!因子2的个数和5的个数计算出来,取少的就是结果

因为在1 2 .....N中 偶数的个数肯定比5的倍数多,所以只要求出N!最多可以表示为5的多少次方。。。就是答案

首先找到1 2 .....N中可以被一个5整除的数的个数,是N/5,存到ret里

然后再找1 2 .....N中可以被25整除数的个数,是N/25,加到ret里(除以25是因为序列里可能存在25的倍数,而上一步只统计了5的倍数,这样就会漏掉一些5)

然后再找1 2 .....N中可以被125整除数的个数,是N/125,加到ret里(除以125是因为序列里可能存在125的倍数,而上一步只统计了25的倍数,这样就会漏掉一些5)
...
.
.
直到five大于N,循环结束,

返回的ret就是结果本回答被提问者和网友采纳
第2个回答  2010-06-29
int faczeros(int n)
{
int rzt = 0;
while (n > 5)
{
n = n/5;
rzt += n;
}
return rzt;
}
第3个回答  2010-06-30
/* 算到0xFFFFFFFF的阶乘没问题. 再大就要换数据类型了 */

#include <stdio.h>

unsigned long Calc ( unsigned long n )
{
unsigned long ret = 0;
unsigned long five;
for ( five = 5; five <= n && five <= 0x48C27395; five *= 5 )
ret += n / five;
return ret;
}

int main ( void )
{
unsigned int n;
scanf ( "%u", &n );
printf ( "%u\n", Calc ( n ) );
return 0;
}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网