求任意整數模3的餘數

在回答這個問題之前,首先思考另一個問題:爲什麼是模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的形式。於是:

a×10+b=n×3+ma×(9+1)+b=n×3+ma×9+(a+b)=n×3+ma+b=k×3+m a\times10+b=n\times3+m\\ a\times(9+1)+b=n\times3+m\\ a\times9+(a+b)=n\times3+m\\ a+b=k\times3+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的約束和倍數可以用這個算法求餘數。當然前提是數字要轉換成相應的進制進行計算,因爲這是一個和進制有關的遊戲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章