[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.

分析

朴素解法:

首先求出n!,然后计算末尾0的个数。(重复÷10,直到余数非0)
该解法在输入的数字稍大时就会导致阶乘得数溢出,不足取。

O(logn)解法:

考虑n!的质数因子。
后缀0总是由质因子2和质因子5相乘得来的。如果我们可以计数2和5的个数,问题就解决了。考虑下面的例子:
n = 5时 5!的质因子中 (2 * 2 * 2 * 3 * 5)包含一个5和三个2。因而后缀0的个数是1。
n = 11时 11!的质因子中(2^8 * 3^4 * 5^2 * 7)包含两个5和三个2。于是后缀0的个数就是2。
我们很容易观察到质因子中2的个数总是大于等于5的个数。因此只要计数5的个数就可以了。那么怎样计算n!的质因子中所有5的个数呢?
观察15! = 有3个5(来自其中的5, 10, 15), 所以计算n/5就可以。但是25! = 有6个5(有5个5来自其中的5, 10, 15, 20, 25, 另外还有1个5来自25=(5*5)的另外一个5),所以除了计算n/5, 还要计算n/5/5, n/5/5/5, n/5/5/5/5, …, n/5/5/5,,,/5直到商为0。

代码

    /*------------------------------------
    *   日期:2015-02-07
    *   作者:SJF0115
    *   题目: 172.Factorial Trailing Zeroes
    *   网址:https://oj.leetcode.com/problems/factorial-trailing-zeroes/
    *   结果:AC
    *   来源:LeetCode
    *   博客:
    ---------------------------------------*/
    #include <iostream>
    #include <cstring>
    #include <vector>
    #include <queue>
    #include <unordered_set>
    using namespace std;

    class Solution {
    public:
        int trailingZeroes(int n) {
            int count_five = 0;
            while ( n > 0) {
                int k = n / 5;
                count_five += k;
                n = k;
            }//while
            return count_five;
        }
    };

    int main(){
        Solution s;
        int n = 10;
        int result = s.trailingZeroes(n);
        // 输出
        cout<<result<<endl;
        return 0;
    }

运行时间

时间: 2024-11-01 01:01:25

[LeetCode]172.Factorial Trailing Zeroes的相关文章

[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. 解题思路:只有因子2和因子5相乘会产生10,同时因为因子2的数量大于因子5的数量,所以只需看序列中因子5的个数.它可以通过n/5得到,同时序列中还含有25,125,--这样的因子,其数量可以通过继续除5来得到. 实现代码: /***********

[LeetCode]73.Set Matrix Zeroes

[题目] Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Follow up: Did you use extra space? A straight forward solution using O(mn) space is probably a bad idea. A simple improvement uses O(m + n) space, but

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

pg_resetxlog整理及测试

pg_resetxlog说明 pg_resetxlog,用来重置/清空一个数据库集群的预写日志以及其它控制内容,其中控制内容由命令pg_controldata可以查看,而内容的来源则是位于$PGDATA/global目录下名为pg_control的控制文件 可选参数有: yunbodeMacBook-Pro:~ postgres$ pg_resetxlog --help pg_resetxlog resets the PostgreSQL transaction log. Usage: pg_r

使用pg_resetxlog修复PostgreSQL控制文件的方法

PostgreSQL 控制文件在$PGDATA/global目录下名为pg_control. 控制文件中记录了以下三部分信息 : 1. initdb时生成的静态信息 : pg_control version number: 922 Catalog version number: 201204301 Database system identifier: 5831753892046499175 Maximum data alignment: 8 Database block size: 8192

Pay attention: Oracle INTEGER is NUMBER(p) not INT4 in PostgreSQL

今天一位朋友问我Oracle转换到PostgreSQL时,Oracle的INT应该转换为PostgreSQL的什么类型? 差点被integer这个词迷惑,其实在Oracle中,integer使用NUMBER来存储的,只是不存储小数. 例如: SQL> set numwidth 50 SQL> create table test(id int); Table created. SQL> insert into test values (9999999999999999999); 1 row

《Thinking in Java》习题——吸血鬼数字

最近在看<Java编程思想>,这本书非常棒,不愧是Java程序员的圣经.看到第四章,后面有道题目很有意思,于是就自己做了做.          1. 我的思路很简单,但是算法效率非常之低.就是把4位数拆成4个数字,比如1260--->1,2,6,0.然后4位数字组合成两个2位数,计算它们        的乘积,相等则就是吸血鬼数字.       1 public class Test2 { 2 /* 3 * 将4位数拆分成4个数 4 * */ 5 public int [] array(

cassandra CONNECT

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; <?php// Setting up nodes://// CassandraConn::add_node(' 192.168.1.1', 9160);// CassandraConn::add_node('192.168.1.2', 5000);//// Quer ying://// $ users = new CassandraCF('Keyspace1'

异版本pg_resetxlog后导致的问题处理

背景 数据库的redo日志损坏时,或者控制文件损坏时,可能导致数据库无法启动. 如果存放pg_xlog或者pg_control文件的块设备遇到问题,可能引发这种情况. 遇到xlog或者控制文件损坏的时候,怎么处理呢? 数据库正常关闭时会写控制文件,redo是在数据库crash后需要用来恢复数据库的,如果数据库正常的关闭,实际上不需要从redo恢复. PostgreSQL 提供了一个工具,用来生成或改写控制文件,抹除指定的pg_xlog. 在数据库因为控制文件损坏,或者pg_xlog损坏,导致数据