各位相加(簡單)
2020年6月9日
題目來源:力扣
解題
- 循環法
最常見的做法,但題目要求不用循環或遞歸做
class Solution {
public int addDigits(int num) {
while(num>=10){
num=num/10+num%10;
}
return num;
}
}
- 模九法
非常巧妙的數學,感覺許多題解寫的並不好,按照自己的理解寫一下
舉個例子,num=461,那麼我們可以按十進制進行分堆
這裏我們可以數出是11個堆,那我們肯定不想這麼數啊,我們可以發現
只要把100的堆減去99,10的堆減去9,加起來就是堆數了,寫成數學公式就是下圖所示,算出括號內的就是堆數
那好,4+6+1=11,還是個大於10的數,那我們可以再進行分堆,自然就是分成兩堆了
此時發現1+1=2<10,正是我們要求的結果,那自然我們想的就會是把4X99+6X9+1X9給去掉,根據他們共同的特點,都是有9或99,我們會想到把整個數模九
這樣我們就可以得到一個小於10的數了,正是我們要求的結果,但是有一個問題,如果我們的數是459呢
你會發現不對,4+5+9=18,1+8=9,答案是9,怎麼變成0了?
那這裏我們要對模9進行優化了,我們想讓最後的9模9之後還是等於9,我們可以寫成(9-1)%9+1=9
可能有些人會有疑惑,爲什麼這樣不會對4X99和6X9也造成影響,我們可以拆成兩部分看,減一的部分只在我最後的尾數部分減,並不影響前面的模九計算
至此,我們可以推導出(num-1)%9+1就是我們要求的答案
class Solution {
public int addDigits(int num) {
return (num-1)%9+1;
}
}