258. Add Digits
Difficulty: Easy
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.
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?有一个非负整数num,重复这样的操作:对该数字的各位数字求和,对这个和的各位数字再求和……直到最后得到一个仅1位的数字(即小于10的数字)。
例如:num=38,3+8=11,1+1=2。因为2小于10,因此返回2。
解题方法1
最好想到的方法当然是模拟题目中所给的步骤,最终求出结果。
//逐位相加的方法
int addDigits(int num) {
int a;
int sum;
sum=num;
while(sum>9) //若相加的和大于9,重复相加步骤,否则返回
{
num=sum;
sum=0;
while(num>0) //获得相加的和
{
a=num%10; //a为某一位上的数字
num=(num-a)/10;
sum+=a; //sum位数num的各位相加之和
}
}
return sum;
}
解题方法2
num模除9的结果与 num的各位之和模除9的结果是一样的。
这道题最后的目标,就是不断将各位相加,相加到最后,当结果小于10时返回。因为最后结果在1-9之间,得到9之后将不会再对各位进行相加,因此不会出现结果为0的情况。
这种方法的时间复杂度为O(1)。
int addDigits(int num) {
return (num-1)%9+1;
}