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

 我来答
sulunbac
2010-06-29 · TA获得超过1477个赞
知道小有建树答主
回答量:914
采纳率:0%
帮助的人:326万
展开全部
先用for循环求阶乘;
然后用取余数的计算判断一下最后一个数字是否为0,比如97010%10,那么就是余数就是0,只要%10就行。余数为0就把他输出,不是0的不用管。也要一个循环来遍历一下。

很简单,自己写好了。
另外任意整数是不现实的,必须定义一个最大值,要不计算机会溢出的,随便给个最大值。比如99999,然后循环求从1到99999的连乘运算。最后循环用%10的方法,是0的就输出,不是0的就罢了。
317358117
2010-06-30 · TA获得超过2036个赞
知道小有建树答主
回答量:705
采纳率:0%
帮助的人:629万
展开全部
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就是结果
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
vbtraz
2010-06-29 · TA获得超过5530个赞
知道大有可为答主
回答量:4152
采纳率:0%
帮助的人:4415万
展开全部
int faczeros(int n)
{
int rzt = 0;
while (n > 5)
{
n = n/5;
rzt += n;
}
return rzt;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
栩箭
2010-06-30 · TA获得超过5310个赞
知道大有可为答主
回答量:3036
采纳率:0%
帮助的人:1632万
展开全部
/* 算到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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式