各位相加(简单)
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;
}
}