N阶乘尾部的0个数

N阶乘尾部的0个数

描述

设计一个算法,计算出n阶乘中尾部零的个数

思路:

1、1 * 2 * 3 * ... * n --> 1 * 2 * 3 * (2 * 2) * 5 * (2 * 3) * 7 (2 2 * 2) * (3 * 3) (2 5) * ...化成质数相乘,只有2 * 5才可能得到结果有尾数中有0

2、因为2的个数是比5多的,求0的个数问题就转化成了求5的个数的问题

3、5 * 5 * 5 * 5 * 5 * ... * 5有n个5 ; 得到有n个5;有几个

4、… ; …

5、5 * 5 有2个5 ; n/5/5得到有两个5有几个,这中也包含了3-4的情况

6、5 * 1 有一个5 ; n/5得到有一个5有几个,这中也包含了3-5的情况

7、把3-6计算的结果相加;

好了,我们跟着思路来写一下代码

/**
     * 统计n阶乘尾部的0个数
     * 思路:
     *  1、1*2*3*...*n --> 1*2*3*(2*2)*5*(2*3)*7*(2*2*2)*(3*3)*(2*5)*...化成质数相乘,只有2*5才可能得到结果有尾数中有0
     *  2、因为2的个数是比5多的,求0的个数问题就转化成了求5的个数的问题
     *  3、5*5*5*5*5*...*5有n个5 ; 得到有n个5有几个
     *  4、...         ; ...
     *  5、5*5 有2个5 ; n/5/5得到有两个5有几个,这中也包含了3-4的情况
     *  6、5 有一个5 ; n/5得到有一个5有几个,这中也包含了3-5的情况
     *  7、把3-6计算的结果相加
     *
     *
     * @param n
     * @return
     */

    public static long trailingZeros(long n) {
        long sum = 0;//统计尾部的0
        //用一个while循环来实现6-3,因为6也包含5-3,5也包含4-3...,所以n不需要再乘以5的个数
        while( (n = n/5) !=0 ) {
            sum += n;
        }
        return sum;
    }

原文地址:https://www.cnblogs.com/qjmnong/p/9102796.html

时间: 2024-08-01 20:05:46

N阶乘尾部的0个数的相关文章

计算n阶乘中尾部零的个数

写在前面 本来觉得问题挺容易的,不打算记录,谁知道一不小心,还真没做出来.最终凭借"朴实"的算法思想解决了问题,但是其中的曲折还真是汗颜.科学的思维指导确实必不可少,"野路子"的朴素的战斗理论不论是效率还是后续的算法演进都经不起考验. 这里只是记录一下自己最近两天对此问题的一些想法,目前只能说是解决了问题,并且满足题目要求.据说问题来自<编程之美>,以后刷书本的时候看到原题,如果需要补充的话,再来更新. And,开始吧~ 正文 题目 设计一个算法,计算出

算法-计算阶乘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

(笔试题)N!尾部连续0的个数

题目: 对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度.如:18!=6402373705728000,尾部连续0的个数是3. (不用考虑数值超出计算机整数界限的问题) 思路: 1.直接计算N!的值,然后统计尾部0的个数,时间复杂度O(n): 2.发散思维,想想尾部为0的数是怎么得到的? 很容易想到2*5即可得到0,则N!可以表示为k*(2^m)*(5^n),由于在N!中m>>n,因此N!=k'*(2*5)^n,即n为尾部为0的个数. 由此,我们只要考虑N!中包含多少

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

一.问题描述 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数.例如: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= 2432902008176640000,其末尾所含有的“0”的个数为4. 二.算法分析 此类问题很显然属于数学问题,一定要找到其中的本质规律才能得到正确的数学模型. 两个大数字相乘,都可以拆分成多个质数相乘,而质数相乘结果尾数为0的,只可能是2*5.如果想到了这一点,那么就可以进一步想到:两个数相乘

NYOJ1026 阶乘末尾非0 【模板】

阶乘末尾非0 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 我们的问题很是简单,n!末尾非0数是几? 比如n=5的时候,n!=120,那么n!末尾非0数是2. 输入 多组数据, 每组数据占一行,每行一个整数0<=n<=10^1000 输出 n!末尾非0数. 样例输入 5 样例输出 2 直接用的网上的模板 /*==================================================*| 阶乘最后非零位,复杂度 O(nlogn) \*==

cut-trailing-bytes:二进制尾部去0小工具

背景 之前的文章 二进制文件处理之尾部补0和尾部去0 中介绍了一种使用 sed 去除二进制文件尾部的 NULL(十六进制0x00)字节的方法. 最近发现这种方法有局限性,无法处理较大的文件.因为 sed 本身是行处理,几百M的二进制文件对 sed 而言就是一个几百M的行,这超出了 sed 的最大限制. 具体的限制条件没有去探究,好像有的版本是硬编码了一个上限,有的版本是取决于可申请的内存. 总之,sed 搞不定了,必须另寻他法. 其实我一直相信有现成的工具可以做到,但在有限的时间内没能找到,就只

笔试算法题(33):烙饼排序问题 &amp; N!阶乘十进制末尾0的个数二进制最低1的位置

出题:不同大小烙饼的排序问题:对于N块大小不一的烙饼,上下累在一起,由于一只手托着所有的饼,所以仅有一只手可以翻转饼(假设手足够大可以翻转任意块数的 饼),规定所有的大饼都出现在小饼的下面则说明已经排序,则最少需要翻转几次,才能达到大小有序的结果(改变饼的顺序只能整体翻转,不能相邻交换): 分析: 假设饼大小编号为1,--,N,1就是最小的饼,N就是最大的饼,最大的N饼翻转到最下面之前,一定需要达到最上面,所以首先需要寻找N饼所在的位置,翻 转到最上面,然后翻转所有的饼,这样N饼就可以就位: 然

N阶乘结果末尾0的个数

N阶乘的结果sum,对这个结果进行质因数分解,sum=2x * 3y * 5z * 7w....,末尾为0是由2*5=10导致的.而被2整除的数比被5整除的数多很多,因此2*5的出现的次数应该是质因数5出现的次数Z. int NumofZero(int N) { int result=0; for(int i=5;i<=N;i+=5) { int temp=i; while(temp%5==0) { result++; temp/=5; } } }

求阶乘后缀0个数【二分】+【数学】

题目链接:http://www.bjfuacm.com/problem/374/                                              星球引力 发布时间: 2018年4月18日 17:36   最后更新: 2018年4月18日 17:39   时间限制: 1000ms   内存限制: 128M 描述 某天,小A获得在太空某星球旅游的机会.这个星球很奇怪,它的引力根据每个人的重量计算的.例如,当小A的体重为5时,则星球对小A的引力为5!后包含0的个数,即5!=