检测一个数能否被3整除


检测一个数能否被3整除
如果一个数的每个位相加之和能被3整除,则这个数就可以被3整除。例如612各位之和为9,则可以被3整除。但是这个解决方法并不高效,我们需要取得每一位,然后再一个个相加。

观察二进制,我们可以找到一个模式来判断一个数能否被3整除。如果所有的偶数位出现1的次数为 even_count, 奇数位出现1的次数为 odd_count,两者只差如果是3的倍数,那么这个数就是3倍数。
例如:23 (00…..0010111)  even_count=3, odd_count = 1.    3-1 不能被2整除,所以不是3的倍数。

其实原因很简单,这是由于10^k≡1(mod3)。这样我们可将10、100、1000……等都看做1,最后将各个数位的数字加起来,若能被3整除,原来的数即可被3整除。
四、七、十三、十六……进制数与十进制数一样,都可以用这个方法。
三、六、九、十二、十六……进制数很明显,可以直接看出。
其他进制数略微麻烦一点,仅以二进制数为例分析如下:

根据:10^(2k+1)+1≡0(mod11)
10^2(k+i)+10^2k+1≡0(mod11)        (k∈N, i∈N)
我们得到二类定可被11(3)整除字符串:
①11、1001、100001、10000001……(3、9、33、129……)
②10101,1010001,101000001……(21、81、321……273)
任一二进制数n的1字符要么在右数奇数位,要么在偶数位。假如奇数位有j个1字符,偶数位有k个1字符。令每个奇数位上的1字符选择一个(且只能一个)偶数位上的1字符,当j=k时,将构成j个①类字符串;假如j≠k,剩余∣j-k∣个1字符必定同在奇数(或偶数)位。若n≡0(mod11),则∣j-k∣≡0(mod11),也就是说这些剩余的1字符可以划分为∣j-k∣/3个②类字符串。
由此可见,利用以上两类字符串判断,不会有遗漏,也不会有重复。
例如,100011100101111001101000010001可以由以下字符串嵌套、交叉、组合而成:
      10111100001101001110001001110010001
      100000000001
      001111
      00000000001001
      000000000000000011
      00000000000000000010000001
      0000000000000000000000100001
00000000000000000000000000100010001
在一个二进制数中,这些字符串可能有很多划分方法,且往往是相互交叉、嵌套在一起的,因此运用起来不够方便。为此根据实践经验推演出几个从左至右划分的,更实用、更利于直观判断的字符串组合。

令:A=00……0(由奇数个连续的0组合的字符串)
        B=1……1(中间为任意多个字符组合,但不包含A字符串)
这样我们的判断就得到一套新的字符串,其中:
0≡0(mod11)   1A01≡0(mod11) 1A1BA21≡0(mod11) (1A01包含“11”)
1≡1(mod11)  1A0≡1(mod11) 1A1BA2≡1(mod11)
1A≡10(mod11)1AB≡10(mod11)1 A1BA20≡10(mod11)
显然0≡0(mod11) 1A01≡0(mod11)无需再证明,如果仅仅是1A01字符串的交叉、嵌套,重要不将其中某个偶数个连续的0字符给段为两个奇数个0字符串,我们一定可依序将它们重新划分为若干个1A01字符串。
A是由奇数个连续的0组合的字符串,AA=A0(或0A),不能够重复出现。
B中间不包含A字符串,BB=B,也不会重复出现。
若A与B重复交叉,其中部分字符必定构成了一个1ABA1字符串。
    由此可见,若二进制数n≡0(mod11),将其从左到右划分为若干字符串,这些字符串最多只有三种类型:0、1A01和1A1BA21。

下面证明1A1BA21≡0(mod11)
由于B=1……1(中间为任意多个字符组合,但不包含A字符串),如果我们将其中包含的1A01字符串按顺序逐一消除(注意,至少要保留1个或2个字符),最终的结果必然剩余“1”或“11”。也就是说,1A1BA21简化为1A11A21或1A111A21两种形式。
1A11A21是前已经证明过的②字符串,毫无疑问,它≡0(mod11);
而1A111A21是1A01与11的嵌套组合字符串,故,1A111A21≡0(mod11)。
于是,1A1BA21≡0(mod11)

最后,证明判断余数的字符串是否正确且无遗漏。
这些字符串一定是1A01、1A1BA21字符串去掉尾部某些字符后形成的。
1A01能够且只能导致三种结果:
1≡1(mod11) 1A≡10(mod11) 1A0≡1(mod11)
对于1A1BA21,显然我们可以只考虑从B字符串开始舍去尾部的部分字符。
舍去某个1字符后的所有字符,只有一种1AB
舍去某个0字符后的所有字符,只有两种1A1BA2、1A1BA20
根据前面的分析,我们同样可以认为,如果我们将B字符串中包含的1A01字符串按顺序逐一消除(注意,至少要保留1个或2个字符),这三种字符串最终简化为:1A1与1A11、1A11A2与1A111A2、1A11A20与1A111A20。
显然1A1=1A0+1
由于1A0≡1(mod11)
故   1A1≡10(mod11)
又1A11=1A+11
故1A11≡10(mod11)
从而证明了1AB≡10(mod11)
例如:101、1011、10110000111、1000100111100111……

如果n的二进制末位为0,那么n和n>>1同时被3整除或者不整除
如果n的二进制末位为1,那么n和(n>>1)-1同时被3整除或者不整除
bool IsTimesOf3(int n)  
{  
    int s;
    if (n < 0)
        n = - n;
    while (n > 0)
    {
        s = n & 1;
        n >>= 1;
        n = n - s;
    }
    return (n == 0);
}
二进制末尾为0 为偶数 假设n=2k;又因为 n能被3整除 所以 n=2*3K=6k;那么 n右移1位 相当于除以2 那么 n=n/2;n=3k ;3K一定会整除3; (不能整除 同理可得 即 n=3k+1); 如果n二进制末尾为1,那么是奇数 n=2k+1;又因为n可以被3整除,那么n=3*(2k+1); n右移1位,再减去1.就等于 3k,3k必然能被3整除(不能整除 同理可得)






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