正数阶乘结尾0的个数

题目:对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。如:18!=6402373705728000,尾部连续0的个数是3。  (不用考虑数值超出计算机整数界限的问题)。

刚看到这道题,脑子中一闪而过的肯定是最原始的方法,但是仔细看看题目,不考虑超出计算机整数边界的问题。显然如果数据过大,求阶乘本身就是个复杂的计算,然后再找结果尾数为0的个数。

1、这个问题当然有简便的方法,我们这样思考,结尾0的个数,就是乘积是10的倍数,因子中有多少个10
就有多少个零,10再次分解就可以得到了2x5的组合。也就是阶乘中含有多少个2x5就有多少个尾数为0。

2,
我们在想像以下,在一个阶乘数的因子中,分解质因数之后,2的个数肯定大于5的个数,注意这里是阶乘数所以才可以有这个定论,要是个普通数字结果肯定不是这样的。所以问题又可以简化到求出阶乘数的因子中有多少个为5的因子。


/*************************************************************************
> File Name: zeronum.c
> Author: Jason
> Created Time: 2014年06月09日 星期一 23时14分46秒
************************************************************************/

#include<stdio.h>

int countFive(int n)
{
int i, ans = 0;
for(i = 5; i <= n; i++)
{
int j = i;
while(j%5==0)
{
ans++;
j /= 5;
}
}
return ans;
}

int main()
{
int n;
scanf("%d",&n);
printf("%d\n",countFive(n));
return 0;
}

正数阶乘结尾0的个数

时间: 2024-10-14 08:40:33

正数阶乘结尾0的个数的相关文章

阶乘中0的个数

任何一个数分解质因数后,表达为2的x1次方   *     3的x2次方   *    5 的x3次方  等等 0的来源于2*5,x1>x2 ,所以阶乘中0的个数为5的个数,下面就很简单了. http://acm.nyist.net/JudgeOnline/problem.php?pid=84 import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-ge

结尾0的个数

结尾0的个数 By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. (注题目来自:http://www.pythontip.com/) 描述: 给你一个正整数列表 L, 如 L=[2,8,3,50], 输出L内所有数字的乘积末尾0的个数, 如样例L的结果为2.(提示:不要直接相乘,数字很多,可能溢出) 分析: 由题意可以想出最简单的办法,即将表中所有元素相乘,最后和10取余得到0的个数.提示中说这样会溢出.但是,我测试发现python的长整型居

阶乘末尾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 ×

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的个数问题

问题:给定一个整数N,那么N的阶乘N!末尾有多少个0? 比如:N=10,N!=3628800,N!的末尾有2个0,写出算法. 回答: int countZero(int N) {    int ans = 0;    int maxInt = 1000000000;//10^9    int  tmpn = N;    while(tmpn){        maxInt /= 10;        tmpn /= 10;    }    int lastBit = 1; //保存上一个阶乘 的

LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 &amp; 二分

题目链接:http://lightoj.com/volume_showproblem.php?problem=1138 题意:给你一个数n,然后找个一个最小的数x,使得x!的末尾有n个0:如果没有输出impossible 可以用二分求结果,重点是求一个数的阶乘中末尾含有0的个数,一定和因子5和2的个数有关,因子为2的明显比5多,所以我们只需要求一个数的阶乘的因子中一共有多少个5即可; LL Find(LL x) { LL ans = 0; while(x) { ans += x/5; x /=

求一个数阶乘末尾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 /

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就会产生

统计结尾0的个数

给一串数组,算出所有元素乘积的末尾0的个数 f1,f2 = 0, 0 L=[] for i in L: while i != 0 and (i % 2 == 0 or i % 5 == 0): if i % 2 == 0: f1 += 1 i /= 2 if i % 5 == 0: f2 += 1 i /= 5 print min(f1, f2) 求一下每一个之中的2,5成对出现的个数,成对一个就有一个10. 好笨的代码的说.