1、简单做法:按照题目来暴力解,双重循环求直到该数小于10
class Solution {
public:
int addDigits(int num) {
int sum=0;
while(num>=10)
{
while(num>0)
{
sum+=num%10;
num/=10;
}
num=sum;
sum=0;
}
return num;
}
};
2、第一次优化,利用数字的规律。
因为当一个数不断各位相加直到小于10的时候输出。
那么可以考虑一下相邻的数有什么联系吗? 答案是有的,相邻的数大小都是相差1。
这里以只有两位数的数为例,其他多位的可以类推。
比如17和18,他们大小相差1,而且他们的十位相等,那么,显然他们的各位相加也是相差1,而这个1来自那个个位相差的1。
那么我们现在再来分析一下十位数不相等的,比如29,30。
30的十位比29的十位大1,由于最后要输出的是小于10的数,那么29的个位为9,当9要加1的时候就会变成10,那么10又得再次相加,最后得到了原来加进去的1,所以当一个数某个位为9的时候(我称之为“满了”),可以直接忽略,不用进行相加。
所以只需要比较他们的十位,也就是3和2,那么30各位相加也是比29各位相加大1。
为了证明一下说服力,我再举个例子,1099和1100。两个9直接省略,那,1099就剩个1,1100为2,因为除去99后,1099变成了1000,和1100仅相差了百位的1。
由此可以得到不太严谨(毕竟没有数学公式证明嘛)的结论,当一个数+1后,它的各位数相加也不断+1,且周期为9,(从1到9不断循环)
这里假设有一个数m,它的各位数为1。那么随着m不断+1,各位数相加也不断+1,所以当m增大9的时候,它各位数相加也增大9,所以变成了10,10再次各位数相加,也就是1。m继续增大,m的各位数相加再次从1开始不断增大,所以有了从1到9的不断循环。
(写了一大串,其实这个规律你多列几个出来就可以看出来了)
class Solution {
public:
int addDigits(int num) {
if(num==0) return 0;
else if(num%9==0) return 9;
else return num%9;
}
};