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