相信大家對於3的倍數皆不陌生,不過解法不外乎是直接取餘數%,因為最直觀
那為何要加上限制條件?就是因為速度!!使用位元運算能比平常的作法更快,因為這就是電腦的思維運作
像是判斷是否為二的倍數,n % 2即可得解,但是n & 1卻能帶來同樣效果,且速度更快
話多了,總言之其實這題目主要的用意,是想讓大家激盪出更多想法
以下為根據大家的解答,總結3的倍數算法:
Method 1:
重複減去3的倍數,判斷最後剩餘的數字為何
雖然看起來這方法很笨,但是的確是可行的做法之一,只需要迴圈和減法即可完成
Method 2:
轉成字串,將所有位數相加,重複此步驟直到剩下個位數,判斷即可
這也是可行的做法之一,但是的確操作上來講較為複雜,需要字串處理和加法運算
Method 3:
將奇數位數字總和 - 偶數位數字總和,重複此步驟直到剩下個位數,判斷即可
這做法使用到了同餘的觀念,在N進位的數字判斷是否為N+1的倍數
簡單來說N ≡ -1 (mod N+1),Number = a2a1a0 = a2 * N^2 + a1 * N^1 + a0 * N^0
將N帶入-1得: a2 - a1 + a0,即是奇數位數字總和 - 偶數位數字總和
具體的原理這裡不再贅述
其實各種Method互相參雜的做法都有
在其中最常見的做法,應該是Method 1 + Method 2,字串輸入後做相加,在重複扣除3
另外,根據本題的定義0 <= n <= 2147483647 (2^31 - 1)
其實也衍伸出了一個特殊作法
如果(uint32_t)n == (uint32_t)((((uint64_t)n * 2863311531u) >> 33) * 3)成立
那麼n就為3的倍數
雖然看起來很複雜,但是原理其實很簡單
上述式子等同於右式 n == n/3*3
2863311531u此數字的由來如下
(2^32 - 1) / 3 = 1431655765u
(2^32) - 1431655765u = 2863311531u ≈ 1431655765u * 2
上述式子中 (n * 2863311531u) >> 33 = (n * 1431655765u * 2) / 2^32 * 2 = n * 1/3
以上
但以python 來講的話不一定,python 大多為CPython 而不是 PythonPython,用內建大部分比較快。