258. Add Digits
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.
题目大意:
给定一个非负整数num,重复地添加所有其数字,直到结果只有一个数字。
For example:
Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
你能在没有任何循环/递归在O(1)运行时做出它吗?
- 首先用递归,这个方法最容易想到但不符合题意
代码如下:
C++
class Solution {
public:
int addDigits(int num) {
int sum = 0;
if(num < 10 && num >=0)
return num;
while(num > 0)
{
int temp = num%10;
sum += temp;
num /= 10;
}
while(sum >= 10)
return addDigits(sum);
return sum;
}
};
查看博客http://www.cnblogs.com/mudao/p/5538105.html
LeetCode上给的提示,维基百科的一篇文章:Digital root 也可以参考输入 0 1 2 3 4 5 6 7 8 9
输出 0 1 2 3 4 5 6 7 8 9输入 10 11 12 13 14 15 16 17 18 19
输出 1,2,3,4,5,6,7,8,9,1输入 20 21 22 23 24 25 26 27 28 29
输出 2,3,4,5,6,7,8,9,1,2输入 30 31 32 33 34 35 36 37 38 39
输出 3,4,5,6,7,8,9,1,2,3
不难发现,除了0 以外,之后所有的数运行后输出是1-9循环
结果=num对9取余,这同样适用于num=0的情况。
但是18不符合情况,还存在问题,18%9=0,但18对应的结果应该是9(1+8=9),所以应该 结果=1 + (num-1)%9代码如下:
C++
int addDigits2(int num) {
return 1+(num-1)%9;
}
代码如下:
C++
int addDigits1(int num) {
while(num >= 10){
num = (num/10)+num%10;
}
return num;
}