#17858: 3的倍數算法


ig99lp33lp33 (위즈원)

學校 : 國立中央大學
編號 : 13275
來源 : [203.69.216.25]
最後登入時間 :
2023-10-11 20:49:51
e189. 3的倍數 - 面試題 -- 트와이스 | From: [1.169.102.8] | 發表日期 : 2019-05-26 15:01

相信大家對於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

以上

 
#21276: Re:3的倍數算法


jerjer920813@gmail.com (YJ)

學校 : 國立政治大學附屬高級中學
編號 : 101106
來源 : [223.136.137.66]
最後登入時間 :
2020-05-16 09:00:54
e189. 3的倍數 - 面試題 -- 트와이스 | From: [223.137.61.227] | 發表日期 : 2020-05-10 21:26

但以python 來講的話不一定,python 大多為CPython 而不是 PythonPython,用內建大部分比較快。



 
ZeroJudge Forum