在回答這個問題之前,首先思考另一個問題:爲什麼是模3的餘數,而不是2或5?
那是因爲3很特殊,求一個數模3的餘數時,有一種巧妙地解法。
算法
算法是將這個數的各位數字加起來,重複這一過程,直到最後得到一位數,這一位數模3的結果就是最終答案。
比如求17%3,1+7=8,8%3=2,於是17%3=2。
參考代碼:
func mod3(num int) int {
sum := num
for sum/10 != 0 {
tmp := sum
sum = 0
for tmp != 0 {
sum += tmp % 10
tmp /= 10
}
}
return sum % 3
}
無論是正數還是複數都可以用這個方法求解。
原理
原理和數的進制有關,其實特殊的並不是3,而是數字9。
對於任意一個數n,可以寫成a×10+b
的形式,同時也可以寫成3×n+m
的形式。於是:
因此n
和它各個位上數字之和模3具有相同的餘數。這其中起關鍵作用的正是9,因爲3是9的約數,因此可以享受這份神奇。
推廣開來,只要是9的約數或倍數,其實都可以用這個算法來求餘數。但是需要注意,大於9的數字的餘數可能會大於10。因此不能加到只剩一位了再取餘,而是加到大於該數的最小數字結束。
比如求28模18的餘數,由於2+8=10<18
,因此不能把2和8加起來,應該直接取餘。
在10進制下,9是最大的一位數,因此具有了這種魔力。繼續推廣,在m進制中,m-1也具有相同的魔力。比如8進制下,7的約數及倍數也可以用這個算法求餘數,16進制下,15的約束和倍數可以用這個算法求餘數。當然前提是數字要轉換成相應的進制進行計算,因爲這是一個和進制有關的遊戲。