学算法有锤子用? 请问亿的阶乘末尾几个零?附java代码实现

如果有人问你, 计算机的能力已经这样强了,算法有啥用?

你可以问他,一个亿的阶乘后面有几个零? 这个问题不是常规计算能解决的,即使交给计算机也要花好长时间...

阶乘函数

阶乘是一种特殊的运算,随着数的增大, 计算量陡增

5! = 5 * 4 * 3 * 2 * 1 = 120

10! = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 3628800

15! = 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 1307674368000

对于某数阶乘 末尾有几个零的问题, 稍加分析就会发现, 其实结果后面有几个零,取决于因数能分解出多少个10, 而10的个数取决于分解出的因数5和因数2的个数,而因数2的个数远多于因数5的个数,所以有多少个因数5, 就有多少个零!

5! 有一个因数5;

10! 有两个因数5;

15! 有三个因数5;

20 ! 有四个因数5;

25 ! 有六个因数5;(25 可以分出两个因数5);

把0的个数转化为因数5的个数, 问题就简单了很多, 求100000000!中因数5的个数,交给计算机能在毫秒级完成! 总共有24999999个零

一个亿的阶乘末尾有几个零

class Solution {
    public static long trailingZeros(long n) {

        // 本质是求一共有多少个因数5

        // 记录5的个数
        long count = 0L;

        /*
        temp的两大作用:
        第一: 临时存储"5"的个数(随着每次的循环更新,会越变越少)
        第二: 控制循环(当temp降为0时, 终止循环)
        */
        long temp = n / 5;

        // 当temp耗尽时, 停止循环
        while (0 != temp){

            // 累加上次记录的"5"的个数
            count += temp;
            // 获得第N 次获取5的个数
            temp = temp / 5;

        }

        return count;

    }
};

class ZeroNum{

    public static void main (String[] args) {

        Solution sol = new Solution();
        // 求1亿的阶乘尾部用多少个零 100000000!
        long result = sol.trailingZeros(100000000);

        System.out.println("一亿的阶乘尾部有"+result+"个零");
    }
}

有了很厉害的算法,还需要计算机么?当然需要!如果没有计算机,即便给出阶乘的结果,谁能保证一次就把零的个数,准确无误的数出来?(正确答案是24999999个零)

原文链接:https://www.jianshu.com/p/c58d194d3136

原文发布于微信公众号 - java工会(javagonghui)

原文发表时间:2018-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏c#开发者

XML Encryption in .Net

XML Encryption in .Net One of the new features being introduced with the Whidbey...

4367
来自专栏iOSer成长记录

RunLoop 源码阅读

1815
来自专栏一个会写诗的程序员的博客

java.sql.SQLException: connection holder is null

java.sql.SQLException: connection holder is null

1341
来自专栏菩提树下的杨过

linq to sql取出随机记录/多表查询/将查询出的结果生成xml

在手写sql的年代,如果想从sqlserver数据库随机取几条数据,可以利用order by NewId()轻松实现,要实现多表查询也可以用select * f...

2196
来自专栏专知

2018年SCI期刊最新影响因子排行,最高244,人工智能TPAMI9.455

2018年6月26日,最新的SCI影响因子正式发布,涵盖1万2千篇期刊。CA-Cancer J Clin 依然拔得头筹,其影响因子今年再创新高,达244.585...

1282
来自专栏祝威廉

Spark Streaming Dynamic Resource Allocation

DRA has already been implemented since Spark 1.2 . However the existing Spark DR...

1403
来自专栏MelonTeam专栏

Bitmap 源码阅读笔记

导语: Android 系统上的图片的处理,跟Bitmap 这个类脱不了关系,我们有必要去深入阅读里面的源码,以便在工作中能更好的处理Bitmap相关的问题...

2498
来自专栏Golang语言社区

Knapsack problem algorithms for my real-life carry-on knapsack

I'm a nomad and live out of one carry-on bag. This means that the total weight o...

1142
来自专栏linux驱动个人学习

高通Audio中ASOC的machine驱动

ASoC被分为Machine、Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的...

9754
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

1112

扫码关注云+社区