2.尾部的零

题目要求出阶乘尾部后有多少个0,其实就是问阶乘里面有多少个10.所以这个问题也就可以等效于问表示阶乘这个数的质因数分解总共有多少个2与5,而2的个数肯定比5的个数多,所以我们只需要求出有多少个5就行了。而质因数分解一个数里有多少个5可以用公式:\(n/5+n/5/5+n/5/5/5+……\)来进行计算。
很多博客都介绍了这种算法,但是没有讲解具体的计算原理(或许是因为有些简单)。这里,我们假设要求1到100里质因数分解后5的个数,首先肯定是先找5的倍数,即5,10,15,20,25……。注意到它们可以表达为\(5*k\)的形式,即5{1,2,3,4,5,6,7,8,9,10,11……}。而k的表示里又有5的倍数,问题就等价于求m={1,2,3,4,5,6,7,8,9,10,11……}里有多少个5,而m的总数为100/5=20个;显然m={1,2,3,4,5,6,7,8,9,10,11……}里5的倍数又可以表示为
\(5*s\),其中s的个数为20/5(100/5/5)。接下来持续进行上述操作即可。最后5的个数为k+m+s+……
通过这个简单的例子我们可以看出求1到100里有多少个质因数5的过程是迭代进行计算的,即先求出一个数n里有多少个5,在求出n/5里有多少个5,在求出n/5/5/5里有多少个5,以此类推,和我之前提出的算法是相同的。
代码如下:

class Solution {
public:
    /*
     * @param n: A long integer
     * @return: An integer, denote the number of trailing zeros in n!
     */
    long long trailingZeros(long long n) {
        // write your code here, try to do it without arithmetic operators.
         long count=0;
         while(n>0)
         {
             count+=n/5;
             n=n/5;
         }
         return count;
    }
};
时间: 2024-10-19 02:43:09

2.尾部的零的相关文章

LintCode 尾部的零

设计一个算法,计算出n阶乘中尾部零的个数 样例 11! = 39916800,因此应该返回 2 分析:0的个数=5的倍数+5^2的倍数+5^3的倍数+5^4的倍数+5^5的倍数+-- class Solution { public: // param n : description of n // return: description of return long long trailingZeros(long long n) { long count=0;//一定是long~~~~ for(

2. 尾部的零【简单】

设计一个算法,计算出n阶乘中尾部零的个数. 思路:0的个数取决于5因子的个数,5的一次方对答案贡献一个0,5的平方贡献两个0,5的三次方贡献3个0......以此类推. 代码: class Solution { public: /* * @param n: A long integer * @return: An integer, denote the number of trailing zeros in n! */ long long trailingZeros(long long n) {

LintCode 2. 尾部的零

题目:设计一个算法,计算出n阶乘中尾部零的个数. 样例 11! = 39916800,因此应该返回 2 挑战 O(logN)的时间复杂度. 解:2*5=10;可当n!展开,观察得2的个数肯定比5的个数多,所以只需统计n!中5的个数即可知尾0的个数. class Solution { public: /* * @param n: A long integer * @return: An integer, denote the number of trailing zeros in n! */ lo

2017校招常考算法题归纳&典型题目汇总

2017校招即将来临,我们为大家整理了2017校招的常考算法类型,以及对应的典型题目. 另附参考答案地址:http://www.jiuzhang.com/solution/ 数学 尾部的零 斐波纳契数列 x的平方根 x的平方根 2 大整数乘法 骰子求和 最多有多少个点在一条直线上 超级丑数 比特位操作 将整数A转换为B 更新二进制位 二进制表示 O(1)时间检测2的幂次 二进制中有多少个1 动态规划 编辑距离 正则表达式匹配 交叉字符串 乘积最大子序列 二叉树中的最大路径和 不同的路径 通配符匹

LintCode 刷题记录

1. A + B 问题:给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符. 思路:使用^来求当前位置上的值,用&来求每个位置上的进位,进位向前移动一位后继续循环,直到进位为0. class Solution { public: /* * @param a: The first integer * @param b: The second integer * @return: The sum of a and b */ int aplusb(int a, int b) { // w

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. 分析:题意即为 阶乘尾部的零(求n!中尾部为0的个数) 思路:我们可以对n!进行质因数分解有 n!=2x*3y*5z*...,显然尾部0的个数等于min(x,z),并且我们容易知道min(x,z)==z 因为:阶乘就是1*2*3*...*n如果我们

OC基础回顾(十四)文件加载与保存

Cocoa提供两个处理文件的通用类:属性列表和对象编码. 1.属性列表 在Cocoa中,有一个类名为属性列表(property list)的对象,通常简写为plist.这些列表包含 Cocoa知道如何操作的一组对象.具体来讲,Cocoa知道如何将它们保存到文件中并进行加载.属性列表类包括NSArray.NSDictionary.NSString.NSNumber.NSDate和NSData,以及它们的可修改形态变体(只要它们拥有前缀为Mutable的类). 1.1 NSDate NSDate是C

fprintf函数

描述 C 库函数 int fprintf(FILE *stream, const char *format, ...) 发送格式化输出到流 stream 中. 声明 下面是 fprintf() 函数的声明. int fprintf(FILE *stream, const char *format, ...) 参数 stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流. format -- 这是 C 字符串,包含了要被写入到流 stream 中的文本.它可以包含嵌入的 f

校招的常考算法类型以及对应的典型题目

数学 尾部的零斐波纳契数列x的平方根x的平方根2大整数乘法骰子求和最多有多少个点在一条直线上超级丑数 比特位操作 将整数A转换为B更新二进制位二进制表示O(1)时间检测2的幂次二进制中有多少个1 动态规划 编辑距离正则表达式匹配交叉字符串乘积最大子序列二叉树中的最大路径和不同的路径通配符匹配 堆 滑动窗口的中位数数据流中位数最高频的K个单词接雨水堆化排序矩阵中的从小到大第k个数 二叉树 二叉树中序遍历二叉树的序列化和反序列化子树最近公共祖先二叉树的层次遍历将二叉树拆成链表在二叉查找树中插入节点