題目描述:
給定一個非負(fù)整數(shù) num,反復(fù)將各個位上的數(shù)字相加,直到結(jié)果為一位數(shù)。
示例:
輸入: 38
輸出: 2
解釋: 各位相加的過程為:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位數(shù),所以返回 2。
在數(shù)學(xué)中,數(shù)根(又稱位數(shù)根或數(shù)字根Digital root)是自然數(shù)的一種性質(zhì),換句話說,每個自然數(shù)都有一個數(shù)根。
數(shù)根是將一正整數(shù)的各個位數(shù)相加(即橫向相加),若加完后的值大于10的話,則繼續(xù)將各位數(shù)進(jìn)行橫向相加直到其值小于十為止[1],或是,將一數(shù)字重復(fù)做數(shù)字和,直到其值小于十為止,則所得的值為該數(shù)的數(shù)根。
數(shù)根可以計算模運算的同余,對于非常大的數(shù)字的情況下可以節(jié)省很多時間。
數(shù)字根可作為一種檢驗計算正確性的方法。例如,兩數(shù)字的和的數(shù)根等于兩數(shù)字分別的數(shù)根的和。
另外,數(shù)根也可以用來判斷數(shù)字的整除性,如果數(shù)根能被3或9整除,則原來的數(shù)也能被3或9整除。
我們把 1 到 30 的樹根列出來。
原數(shù): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
數(shù)根: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3
可以發(fā)現(xiàn)數(shù)根 9 個為一組, 1 - 9 循環(huán)出現(xiàn)。我們需要做就是把原數(shù)映射到樹根就可以,循環(huán)出現(xiàn)的話,想到的就是取余了。
結(jié)合上邊的規(guī)律,對于給定的 n 有三種情況。
n 是 0 ,數(shù)根就是 0。
n 不是 9 的倍數(shù),數(shù)根就是 n 對 9 取余,即 n mod 9。
n 是 9 的倍數(shù),數(shù)根就是 9。
我們可以把兩種情況統(tǒng)一起來,我們將給定的數(shù)字減 1,相當(dāng)于原數(shù)整體向左偏移了 1,然后再將得到的數(shù)字對 9 取余,最后將得到的結(jié)果加 1 即可。
Java代碼:
class Solution {
public int addDigits1(int num) {
while(num >= 10) {
int next = 0;
while(num != 0) {
next += num % 10;
num /= 10;
}
num = next;
}
return num;
}
public int addDidits2(int num) {
return (num - 1) % 9 + 1;
}
}