c语言中怎么得到任意整数的阶乘末尾的0的个数?
4个回答
展开全部
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就是结果
恩恩,程序差不多了 ,我就给你说下这个算法的原理:
如果想在末尾凑成个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就是结果
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int faczeros(int n)
{
int rzt = 0;
while (n > 5)
{
n = n/5;
rzt += n;
}
return rzt;
}
{
int rzt = 0;
while (n > 5)
{
n = n/5;
rzt += n;
}
return rzt;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/* 算到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;
}
#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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询