求1000!的未尾有几个0

mousestuman 2013-10-19 09:20:43
求1000!的未尾有几个0(用素数相乘的方法来做,如72=2*2*2*3*3);

求出1->1000里,能被5整除的数的个数n1,能被25整除的数的个数n2,能被125整除的数的个数n3,

能被625整除的数的个数n4.

1000!末尾的零的个数=n1+n2+n3+n4;

这是什么原因呢?请解释下,谢谢
...全文
428 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-11-01
  • 打赏
  • 举报
回复
第一个事实:如果两数a和b相乘,末尾有0,那么a或者b必然有5和2的因子(a有5的因子,b有2的因子;或者反过来;或者a同时有5和2的因子;又或者b同时有5和2的因子)。 第二个事实:如果两数a和b相乘,末尾有几个0,那么就至少有几个5和2的因子(末尾一个0,至少有一个5的因子,一个2的因子;末尾两个0,至少有两个5的因子,两个2的因子;……)。 那么10!末尾有几个0? 只有10和5有5的因子,所以只有两个5的因子,而含有2的因子的个数远大于两个,所以,10!末尾有两个0。 1到n中,因子2的个数远大于因子5的个数,故求n!末尾0的个数,实际上就是求1到n中,因子5的个数。
bigwangdi 2013-10-31
  • 打赏
  • 举报
回复
看看《编程之美》吧,原题
Smile_大笑 2013-10-31
  • 打赏
  • 举报
回复
引用 3 楼 wangdahu888 的回复:
分析 5的1次幂5的倍数增加1个0 (5,10,15,20,25,30,.....) 5的2次幂25的倍数增加2个0(必然是5的倍数)(25,50,75,100,125.....) 5的3次幂125的倍数增加3个0(必然是25的倍数)(125,250,375,500.....) 5的4次幂625的倍数增加4个0(必然是125的倍数)(625,1250,1875,2500.....) ........... 所以先求出5的倍数 加上25的倍数(2个0,其中1个已记入5的倍数) 加上125的倍数(3个0,其中1个已记入5的倍数1个已记入25的倍数) 加上625的倍数(4个0,其中....................................) 1000/5=200 (1000里面含有200个5的倍数,但同时也包含了25倍数,125的倍数,625的倍数各一次) 1000/25=40(1000里面含有40个25的倍数,同时也含有125的倍数,625的倍数各一次) 1000/125=8(1000里面含有8个125的倍数,同时也含有625的倍数) 1000/625=1(1000里含有1个625的倍数) 所以1000!里面含 有0的个数为200+40+8+1=249个
还是搞不懂
光流溢彩 2013-10-31
  • 打赏
  • 举报
回复

仅供参考
#include <stdio.h>
int main(int argc,char *argv[])
{
	int inum=1000,i=0,j=0,icount=1,temp,jinwei,result=0;
	int ires[50000]={0};
	for(i=2;i<inum;i++)
	{
		jinwei=0;
		for(j=1;j<icount;j++)
		{
			temp=ires[j]*i+jinwei;
			ires[j]=temp%10;
			jinwei=temp/10;	
		}
		while(jinwei)
		{
			ires[++icount]=jinwei%10;
			jinwei/=10;
		}
	}
	for(j=1;j<=icount;j++)
	{
		if(ires[j]==0)
		{
			result++;
		}
		else
		{
			printf("总共有%d个0",result);		
			return 0;
		}
		
	}
	return 0;
}

buyong 2013-10-31
  • 打赏
  • 举报
回复
也就是说1000!能被5^X正除,就有X个0
anthow 2013-10-19
  • 打赏
  • 举报
回复
引用 3 楼 wangdahu888 的回复:
分析 5的1次幂5的倍数增加1个0 (5,10,15,20,25,30,.....) 5的2次幂25的倍数增加2个0(必然是5的倍数)(25,50,75,100,125.....) 5的3次幂125的倍数增加3个0(必然是25的倍数)(125,250,375,500.....) 5的4次幂625的倍数增加4个0(必然是125的倍数)(625,1250,1875,2500.....) ........... 所以先求出5的倍数 加上25的倍数(2个0,其中1个已记入5的倍数) 加上125的倍数(3个0,其中1个已记入5的倍数1个已记入25的倍数) 加上625的倍数(4个0,其中....................................) 1000/5=200 (1000里面含有200个5的倍数,但同时也包含了25倍数,125的倍数,625的倍数各一次) 1000/25=40(1000里面含有40个25的倍数,同时也含有125的倍数,625的倍数各一次) 1000/125=8(1000里面含有8个125的倍数,同时也含有625的倍数) 1000/625=1(1000里含有1个625的倍数) 所以1000!里面含 有0的个数为200+40+8+1=249个
正解,学习了
  • 打赏
  • 举报
回复
分析 5的1次幂5的倍数增加1个0 (5,10,15,20,25,30,.....) 5的2次幂25的倍数增加2个0(必然是5的倍数)(25,50,75,100,125.....) 5的3次幂125的倍数增加3个0(必然是25的倍数)(125,250,375,500.....) 5的4次幂625的倍数增加4个0(必然是125的倍数)(625,1250,1875,2500.....) ........... 所以先求出5的倍数 加上25的倍数(2个0,其中1个已记入5的倍数) 加上125的倍数(3个0,其中1个已记入5的倍数1个已记入25的倍数) 加上625的倍数(4个0,其中....................................) 1000/5=200 (1000里面含有200个5的倍数,但同时也包含了25倍数,125的倍数,625的倍数各一次) 1000/25=40(1000里面含有40个25的倍数,同时也含有125的倍数,625的倍数各一次) 1000/125=8(1000里面含有8个125的倍数,同时也含有625的倍数) 1000/625=1(1000里含有1个625的倍数) 所以1000!里面含 有0的个数为200+40+8+1=249个
warlooy_24 2013-10-19
  • 打赏
  • 举报
回复
由于2*5=10,有一个0,(10可以分解成2、5来看),只要求得1000!中可分解为多少个5相乘(2太多); 1000/5=200,意思是:1000个数可分解为有一个5的有200个:5,10,15。。。。。。。 200/5=20,意思是,200个数中还能继续分解出5的有25、50。。。。。。。 后面都是一样的道理 也就相当于你说的被5、25、125这些整除
warlooy_24 2013-10-19
  • 打赏
  • 举报
回复
1000/5=200; 200/5=40; 40/5=8; 8/5=1; 200+40+8+1=249;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧