N的阶乘末尾有多少个零?

创联ifLab的招新问答卷上看到这么一题,大意是:

给出一个整数N,求N!(N的阶乘)的末尾有多少个零?

由于在N特别大的时候强行算出N!是不可能的,所以肯定要另找方法解决了。

首先,为什么末尾会有0?因为2*5 = 10,0就这么来了。所以只要求出这N!中有多少个2多少个5相乘就好了,由于2的出现次数肯定是大于5的,所以只要求有多少个5相乘就好了。

因为求的是N的阶乘,而 N! = 1*2*3*....*N

那么:这N个数中能被5整除的个数 = N / 5

比如N = 50 ,能被5整除的有 5 10 15 20 25 30 35 40 45 50 共10个,即50/5=10

但别忘了25和50,他们可拆分成5*5和5*5*2,也就是说能被5^2整除的数会带来2个零(以此类推5的m次方会在末尾带来m个零)。

所以50!末尾有10+2=12个“0”。

所以额外还要求出这5的m次方的数的个数,我们可以从5到5*5到5*5*5 ... 慢慢往大的找。

那么具体代码如下(借鉴于网络,2L的答案)

 1 int totalzero(int n)
 2 {
 3     int total = 0;
 4     while (n > 5)
 5     {
 6         n = (n - (n % 5)) / 5;
 7         total += n;
 8     }
 9     return total;
10 }

这里的第n次循环相当于求能被5^n整除的数有多少,并把结果相加。

代码的效果相当于

第一次:能被5整除的数 = n / 5

第二次:能被25整除的数 = n / 5 / 5

第三次.....

第四次.......

虽然每次循环后n的数值变了,但整体效果还是相当于在求能被5^n整除的数有多少。

时间: 2024-10-29 10:47:35

N的阶乘末尾有多少个零?的相关文章

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

阶乘末尾的零个数

[编程题] 末尾0的个数 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2 输入描述: 输入为一行,n(1 ≤ n ≤ 1000) 输出描述: 输出一个整数,即题目所求 输入例子: 10 输出例子: 2方法:Z = N/5 + N /(5*5) + N/(5*5*5).....知道N/(5的K次方) 1 import java.util.Scanner; 2 3 public class Test60 { 4 5 public s

N!中末尾有多少个0

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

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

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

求一个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

阶乘末尾0的个数

问题很简单:给定一个整数n,那么n的阶乘末尾有多少个连续的0呢? 那个可以去求这个阶乘吗,大数的代码上去一套?这个大数求出来肯定是很慢的,还有其他方法吗,你可以观察一个产生0,本质是2*5,出现了2一定会出现5,2的个数会大于5的个数,所以我可以直接统计5的个数,统计每个数有几个因子5 #include <bits/stdc++.h> using namespace std; int main() { int n; while (cin >> n) { int num = 0 ,i

n的阶乘结果中一共有多少个零?

题目:n的阶乘中一共有多少个零? 解答:产生零的结果只能有一种可能性那就是2*5=10,然而n的阶乘本质上是可以拆解为很多2和5以及其他不包含2和5的乘数的积,例如5的阶乘:1*2*3*4*5=1*2*3*2*2*5.按照这个思路,将n的阶乘乘积的每一项进行拆解,看看可以拆解出多少个2和多少个5,然后取2的个数和5的个数中最小的即可.程序代码如下: #include <stdio.h> int compute_zero(int n) { int five_count = 0; int two_

[LeetCode] Factorial Trailing Zeroes 求阶乘末尾零的个数

Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. Credits:Special thanks to @ts for adding this problem and creating all test cases. 这道题并没有什么难度,是让求一个数的阶乘末尾0的个数,也就是要找乘数中10的个数,

哪几个数的阶乘末尾有n个0?其中n是一个正整数,从键盘输入

题目:哪几个数的阶乘末尾有n个0?其中n是一个正整数,从键盘输入. 1 int main( void ) /* name: zerotail.cpp */ 2 { int num, n, c, m; 3 cout<<"输入零的个数(>0):"; cin>>n; 4 while( n>0 ) 5 { c=0; num=0; 6 do 7 { num+=5; 8 m=num; 9 while( m%5==0 ) 10 { c++; 11 m/=5; 12