Java, C++, linux c, C#.net 技术,软件架构,领域建模,IT 项目管理 Dict.CN 在线词典, 英语学习, 在线翻译
新浪博客:新浪 blog MSN: wbjeasygo@163.com Email: wbjeasygo@163.com QQ 精英群: 47763528 空间:QQ空间 淘宝店:新开淘宝书店 致谢: 感谢雷老师几年的指导 感谢导师在学业上的关怀, 感谢老婆的支持, 感谢我的同学和同事, 在我成长的路上有你。
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: BlogJava Copyright © Jack.Wang