求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     }
13     return 0;
14 }

方法二:分治法。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     int n,cnt;
 5     while(cin>>n){
 6         cnt=0;
 7         while(n)cnt+=n/5,n/=5;
 8         cout<<cnt<<endl;
 9     }
10     return 0;
11 }

原文地址:https://www.cnblogs.com/acgoto/p/9465573.html

时间: 2024-10-13 03:21:09

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

求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

NEFU 118 n!后面有多少个0【数论】

http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=118 求n!后面有多少个0(1<=n<=1000000000),显然,n!肯定存不下. 2*5=10,所以有多少个2*5就有多少个0,所以只须求n!中因子2和因子5的个数.根据结论有 f(2) = [ n / 2 ] + [ n / 4 ] + [ n / 8 ] + -- f(5) = [ n / 5 ] + [ n / 25 ] + [ n / 125 ] + --

求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

求一个n!中尾数有多少个零

题目描述: 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2 输入描述: 输入为一行,n(1 ≤ n ≤ 1000) 输出描述: 输出一个整数,即题目所求 示例1 输入 10 输出 2 解题思路: 能被5(5^1)整除的提供1个0 能被25(5^2)整除的提供2个0 能被125(5^3)整除的提供3个0 能被625(5^4)整除的提供4个0 所以 结果= n/5 + n/25 + n/125 + n/625 #include<io

100!的尾数有多少个零?100的阶层真的算不出来吗?

今天看到一个蛮有意思的题,是问"100!"的尾数有多少个零. 尾数有多少个零,实际上指的是从这个数的最后一个不为0的数的下一个(也就是0)开始计数,一直到最后一个数(这些数自然都是0)有多少个0. 好吧,也就是说13330330000的尾数有4个零-- 一个整数若含有因子5,则必然在求解100!时产生一个0,也就是说我们从5开始for循环,每次循环都给加上5,然后计数器加1.同时如果该整数还能被25整除,计数器还应该再加上1. 因此代码如下: #include<stdio.h&g

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++)

nefu 118 n!后面有多少个0 算数基本定理,素数分解

n!后面有多少个0 Time Limit 1000ms Memory Limit 65536K description 从输入中读取一个数n,求出n!中末尾0的个数. input 输入有若干行.第一行上有一个整数m,指明接下来的数字的个数.然后是m行,每一行包含一个确定的正整数n,1<=n<=1000000000. output 对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数. sample_input 3 3 100 1024 sample_output 0 24 253 考

NEFU 118 n!后面有多少个0 (n!的素因子幂问题)

n!后面有多少个0 Problem : 118 Time Limit : 1000ms Memory Limit : 65536K description 从输入中读取一个数n,求出n!中末尾0的个数. input 输入有若干行.第一行上有一个整数m,指明接下来的数字的个数.然后是m行,每一行包含一个确定的正整数n,1<=n<=1000000000. output 对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数. sample_input 3 3 100 1024 sample