[编程之美] 2.2 不要被阶乘吓倒


http://www.xuebuyuan.com/2067143.html
问题1:给定一个整数N,那么N的阶乘N! 末尾有多少个0?
这里的思路:考虑哪些数相乘能得到10。将结果表示成N! = K * pow(10, M),然后对N! 进行因式分解,只有2 * 5会得到10,那么N! 的末尾的0的个数就是因式分解后2和5的幂的最小值。由于整数中出现2的倍数的频率比出现5的频率低,因此,结果就可以直接等于5的幂。
解法一直接处理1到N所有的数,对于每个数,求出它的5的幂。
解法二就要细说了:
将结果表示为[N/5] + [N/pow(5, 2)] + [N/pow(5, 3)] +...,也就是说,5的倍数贡献一个5,pow(5, 2)的倍数再贡献一个5,pow(5, 3)的倍数再贡献一个5。
  1. int FindZeroNum(int N)//每次迭代,就求出多少个5^M贡献5  
  2. {  
  3.     int nCount = 0;  
  4.     while(N)  
  5.     {  
  6.         N = N / 5; //1-N能奉献多少个5  
  7.         nCount += N;  
  8.     }  
  9.     return nCount;  
够得到1到N中有多少个5的倍数,然后再N /= 5,也就是N / 25,即pow(5, 2)的倍数贡献的5的个数。
问题2:求N! 的二进制表示中最低位1的位置。
要求阶乘的二进制表示中最低位1的位置,其实就是求N! 的二进制表示中末尾有多少个0,也即N! 含有质因数2的个数。
对上面一句话的理解:如果N!含有n个2的乘积,那么,N!必定可以通过右移n-1位使得最后一位不为1,因此,就是寻找N!含有质因数2的个数。
由问题一有:[N/2] + [N/pow(2, 2)] + [N/pow(2, 3)] + ...。
对上面一句的理解:N/2得到的是1到N中2的倍数的个数(也就是2,4,6,8等等),N/pow(2, 2)得到的就是1到N中4的倍数的个数(也就是4,8,12,16等等),后面的依次类推。
N!中含有质因数2的个数等于:[N/2]+[N/4]+[N/8]+…
  1. int FindLowestOne(int nNum)  
  2. {  
  3.     assert(nNum > 0);  
  4.     int nCount = 0;  
  5.     int N = nNum;  
  6.     while(N)  
  7.     {  
  8.         N = N >> 1;  
  9.         nCount += N;  
  10.     }  
  11.     return nCount + 1;  
  12. }  
方法二:

以下为规律的推导:N!中含有2的质因数的个数等于[N/2]+[N/4]+[N/8]+…
对于11011即:1101+110+11+1 = (1000+100+1) + (100+10) + (10+1) + 1=
1000+100+10+1 + 100+10+1 + 1= 1111+111+1 = 10000-1 + 1000-1 + 10-1 + 1-1=
11011-(N的二进制表示中含有1的个数)
  1. int FindOneNum(int nNum)  
  2. {  
  3.     int nCount = 0;  
  4.     while(nNum)  
  5.     {  
  6.         nCount++;  
  7.         nNum = nNum & (nNum - 1);  
  8.     }  
  9.     return nCount;  
  10. }  
  11. /*nNum中最低1的位置*/  
  12. int FindLowestOne(int nNum)  
  13. {  
  14.     assert(nNum > 0);  
  15.     return nNum - FindOneNum(nNum) + 1;  
给定整数n,判断它是否为2的方幂。
n > 0 && (n & (n - 1)) == 0

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts