java, c , linux c, c#.net 技术,软件架构,领域建模,it 项目管理
新浪博客:msn: email: qq 精英群: 47763528 空间: 淘宝店: 致谢: 感谢雷老师几年的指导 感谢导师在学业上的关怀, 感谢老婆的支持, 感谢我的同学和同事, 在我成长的路上有你。
1. 给定一个 n ,求出n!末尾有多少个零,比如 n=10,n!=3628800,n!末尾有两个零。 2. 求n!的二进制表示中最低为1的位置,比如 11010010, 最低为1的位置为2。
问题一解法:
在上一个 blog 中介绍的子数组乘积最大值的问题中,有朋友考虑到溢出的问题,在这个问题中,我们从那些数相乘能得到10这个命题开始思考。比如n!=k×10m那么n!后面就有m个零。这个问题转化为将n!进行分解,如n!=2a×3b×5c 很显然 10=2×5,那么零的个数m=min(a,c), 一个数能够被2整除的机率比5要大很多因此 m=c,因此转化为求 c的问题,具体算法如:
问题二解法:
我们都知道一个数除以2可以表示为 n>>1,即向右移动一位。这个问题转化为求 n! 含有2的质因数的个数问题。
完整程序:
powered by: 凯发k8网页登录-凯发天生赢家一触即发官网 凯发天生赢家一触即发官网 copyright © jack.wang