求N的阶乘N!中末尾0的个数

有道问题是这样的:给定一个正整数N,那么N的阶乘N!末尾中有多少个0呢?例如:N=10,N!=3628800,则N!的末尾有两个0;

直接上干货,算法思想如下:

对于任意一个正整数N!,都可以化为N!= (2^X)  * (3^Y)* (5^Z)......的形式,要求得末尾0的个数只需求得min(X, Z)即可,

由于是求N!,则X >= Z; 即公约数5出现的频率小于等于2出现的频率,即Z=min(X, Z),即出现0的个数等于公约数5出现的次数;

源码如下:

方法一:

#include <stdio.h>
int main()
{
    int N;
    int sum = 0;
    scanf("%d", &N);          // 输入N
    for(int i = 1; i <= N; i++)
    {
        int j = i;
        while(0 == j % 5)
        {
            sum++;            // 统计公约数5出现的频次
            j /= 5;
        }
    }

    printf("%d\n", sum);

    return 0;
}

  方法二:

#include <stdio.h>
int main()
{
	int N;
	int sum = 0;
	scanf("%d", &N);
	while(N)
	{
		sum += N / 5;
		N /= 5;
	}
	printf("%d\n", sum);

	return 0;
}

  

时间: 2024-11-20 01:04:59

求N的阶乘N!中末尾0的个数的相关文章

N!结果中末尾0的个数 2.2

主要是看N!结果中2的个数和5的个数,多的那个个数即是末尾0的个数 ? ? ? ? 计算Z有两种方法 ? ? 一种是对每个n都去看有多少个5的因子 ? ? 一种是隔5个增加一个5的因子,隔25个再在之前的基础上增加一个5的因子 ? ? 两种方法差不多 ? ? 第二种,循环少 ? ? package numOfZeroFactorialN_2_2; ? ? public class NumOfZeroFactorialN_2_2 { ? ? static int numOfZeros(int n)

2.2阶乘中末尾0的个数

#include<iostream> using namespace std; int count(int N) { if(N==0) return 0; int num=0; for(int i=1;i<=N;++i) { int j=i; while(j%5==0) { num++; j/=5; } } return num; } int aa(int N) { int sum=0; while(N) {sum+=N/5; N/=5;} return sum; } int main(

Java 计算N阶乘末尾0的个数-LeetCode 172 Factorial Trailing Zeroes

题目 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 分析 Note中提示让用对数的时间复杂度求解,那么如果粗暴的算出N的阶乘然后看末尾0的个数是不可能的. 所以仔细分析,N! = 1 * 2 * 3 * ... * N 而末尾0的个数只与这些乘数中5和2的个数有关,因为每出现一对5和2就会产生

N的阶乘末尾0的个数和其二进制表示中最后位1的位置

问题一解法: 我们知道求N的阶乘结果末尾0的个数也就是说我们在从1做到N的乘法的时候里面产生了多少个10, 我们可以这样分解,也就是将从0到N的数分解成因式,再将这些因式相乘,那么里面有多少个10呢? 其实我们只要算里面有多少个5就可以了? 因为在这些分解后的因子中,能产生10的可只有5和2相乘了,由于2的个数是大于5的个数的,因此 我们只要算5的个数就可以了.那么这个题目就是算这些从1到N的数字分解成因子后,这些因子里面 5的个数. Python代码 def factorialnumberof

求一个数阶乘末尾0的个数

#include<iostream> using namespace std; //给定一个整数N,那么N的阶乘末尾有几个0?N=10,N!=3628800,末尾有2个0 //1.如果我们从"哪些数相乘能得到 10"这个角度来考虑,问题就变得简单了. //首先考虑,如果 N!= K×10M,且 K 不能被 10 整除,那么 N!末尾有 M 个 0.再考虑 //对 N!进行质因数分解,N!=(2x)×(3y)×(5z)-,由于 10 = 2×5,所以 M 只跟 X 和 Z /

算法-计算阶乘n!末尾0的个数

算法逻辑转载自计算阶乘n!末尾0的个数: 问题描述    给定参数n(n为正整数),请计算n的阶乘n!末尾所含有"0"的个数.    例如,5!=120,其末尾所含有的"0"的个数为1:10!= 3628800,其末尾所含有的"0"的个数为2:20!= 2432902008176640000,其末尾所含有的"0"的个数为4. 计算公式    这里先给出其计算公式,后面给出推导过程.    令f(x)表示正整数x末尾所含有的&q

2015华为机试——求n!中含有0的个数

题目描述: 求n!中含有0的个数,例如1!= 1 含有0个0,5! = 120 含有1个0,10! = 3628800 含有2个0 解题思路: 这题之前在leetcode中做过,如果先对n进行阶乘运算,然后%10求0的个数.但是n!很有可能溢出,所以需要找到它的等效方法,0的个数即为10的个数,即为5于2的个数,显然在n!中,2的个数要大于5的个数,因此只要算出n范围内有多少个5就OK 代码如下: public static int getZeroCount(int n) { /*在这里实现功能

阶乘末尾0的个数(证明)

先给出算法: 给定n,求n的阶乘末尾0的个数. int res = 0; while (n > 0) { res += n / 5; n /= 5; } 因为: 比方说求15的阶乘,也就是求 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 10 × 11 × 12 × 13 × 14 × 15 的末尾0的个数.现在我们把这15个数分解出来含有5的因子 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 2   × 11 × 12 × 13 × 14 ×

POJ 1401 &amp;&amp; ZOJ 2202 Factorial 阶乘N!的末尾零的个数

POJ 1401 && ZOJ 2202 Factorial 阶乘N!的末尾零的个数 题目地址: POJ 1401 ZOJ 2202 题意: 求N!后面有几个0. 分析: 组合数学类型的题目. 正常的话可能会去分解1~N数里面有几个5和2,但是这样的复杂度为O(nlogn). 其实有更巧妙的办法,可以把问题分解成子问题. 可以发现N!末尾的0与1~N中有几个5的因子相同(因为2总是比5多). 1~N中只有5的倍数包含5因子,比如[5, 10, 15, 20...],所以我们抽出其中每个数的