求N!中末尾有多少个0

分析:

对N进行质因数分解 N=2^x * 3^y * 5^z...,由于10 = 2*5,所以末尾0的个数只和x与z有关,每一对2和5相乘可以得到一个10,于是末尾0的个数=min(x,z)。在实际中x是远远大于z的,所以我们只要求出z的值即可。

根据公式

z = N/5 + N/5^2 + N/5^3+...+N/5^k

这表明,5的倍数贡献了一个5,5^2的倍数又贡献了一个5...。

比如:25其实是贡献了2个5,但是在N/5中已经贡献了一个,所以在N/5^2中再贡献一个;同样,125在N/5中贡献一个,在N/5^2中贡献一个,在N/5^3中再贡献一个,一共是3个。

代码:

	public int getContinueZero(int num){
		int countOfZero = 0;
		while(num>0)
		{
			countOfZero+=num/5;
			num/=5;
		}
		return countOfZero;
	}

用同样思路解下一题:

求N!的二进制中最低位1的位置。实际上就是判断二进制末尾有多少个0,然后位置=0的个数+1;

判断二进制末尾0的个数可以用右移操作来完成。而二进制每次右移一位相当于十进制除以2,直到除不够为止。所以归根结底就是要求N!质因数分解的2的个数x。这个操作与上面求5的个数如出一辙。

求N!中末尾有多少个0

时间: 2025-01-13 23:36:37

求N!中末尾有多少个0的相关文章

N!中末尾有多少个0

问题:先从100!的末尾有多少零         =>    再推广到  任意N!的末尾有多少个零 分析:首先想到慢慢求解出100!或N!,但计算机表示数有限,且要防止溢出. 则从数学上分析:一个整数若含有一个因子5则必然会在求100!时产生一个零,                               问题转化为:求1到100,这100个整数中包含了多少个因子5.                                若整数N能被25整除,则N包含2个因子5,若N能被5整除,则N

求n! 末尾有多少个0

其实是求1到n 每个数的最小质因子有多少个5,有多少个5就有多少个0,因为2的个数明显大于5的个数 #include<iostream> using namespace std; int judge(int i){//计算i的最小质因子里有几个5 int cou=0; while(i%5==0){ cou++; i/=5; } return cou; } int main(){ int n; while(cin>>n){ int cou=0; int ans=0; for(int

N的阶乘末尾有多少个0

N的阶乘(N!)中的末尾有多少个0? N的阶乘可以分解为: 2的X次方,3的Y次方,4的5次Z方,.....的成绩.由于10 = 2 * 5,所以M只能和X和Z有关,每一对2和5相乘就可以得到一个10,于是M = MIN(X,Z),不难看出X大于Z,因为被2整除的频率比被5整除的频率高的多. 要计算Z,最直接的方法就是求出N的阶乘的所有因式(1,2,3,...,N)分解中5的指数.然后求和 1 int fun1(int n) 2 { 3 int num = 0; 4 int i,j; 5 6 f

编程之美3——N!末尾有多少个0

因为n!是一个非常大的数,所以不能通过常规的方法,求出n!的值之后,再判断它的末尾有多少个0. 这里的关键就是,n!的末尾有多少个0,取决于n!中,质因数 5 的个数. 如:12!=479001600    ,其中,5.10各含有1个质因数5,所以12!末尾有2个0 代码1: #include <iostream> using namespace std; int main(void) { int n,i,j,m; m=0; cin>>n; for(i=1;i<=n;i++)

从“n!末尾有多少个0”谈起

在学习循环控制结构的时候,我们经常会看到这样一道例题或习题.问n!末尾有多少个0?POJ 1401就是这样的一道题. [例1]Factorial (POJ 1401). Description The most important part of a GSM network is so called Base Transceiver Station (BTS). These transceivers form the areas called cells (this term gave the

求N!末尾所得数字0的个数

题目:给定一个整数N ,那么N 的阶乘N !末尾有多少个0呢? 例如:N = 10,N! = 3628800,所以N!末尾就有2个零. 分析:如果直接先算出N!阶乘,很容易导致内存溢出.显然,直接算出来是不行的.所以,我们可以换一个角度来分析这个问题.我们知道 N! = 1*2*3*4*......*N,所以,我们可以对N!进行分解质因数.即N! = 2^x * 3^y * 5 ^z........可以看到2和5相乘,必然会产生一个零.那么问题就转化为2^x * 5^z可以产生多少个零就可以了.

NYOJ 954 求N!二进制末尾几个0

NYOJ 954 求N!二进制末尾几个0 题目地址: NYOJ 954 题意: 中文题不解释. 分析: 即是求N!二进制末尾几个0,换句话就是求N!的因子有几个2. 具体做法跟POJ 1401一样,题解见:POJ 1401 && ZOJ 2202 Factorial 阶乘N!的末尾零的个数 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: 954.cpp * Create Date: 2014-05-26 20:31:

2014! 的末尾有多少个0

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

求N!尾数有多少个0

方法一:直接求因子5的个数. 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int n,cnt,tmp; 5 while(cin>>n){ 6 cnt=0; 7 for(int i=5;i<=n;i+=5){ 8 tmp=i; 9 while(tmp%5==0)cnt++,tmp/=5;//累加因子5的个数 10 } 11 cout<<cnt<<endl; 12 } 1