258. Add Digits
题目:
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?
概念:
数根:数根(又称数字根Digital root)是自然数的一种性质,换句话说,每个自然数都有一个数根。数根是将一正整数的各个位数相加(即横向相加),若加完后的值大于等于10的话,则继续将各位数进行横向相加直到其值小于十为止,或是,将一数字重复做数字和,直到其值小于十为止,则所得的值为该数的数根。例如54817的数根为7,因为5+4+8+1+7=25,25大于10则再加一次,2+5=7,7小于十,则7为54817的数根。
思路:
思路1(常规方法):
- 将num从int类型转化为string类型
- 将字符串的每一位分别转化为数字进行相加,判断相加后的结果是否为1位
- 若为否,则重复上述操作直至最终结果为1位
我采用了循环和递归两种方法实现该思路。
1 #include<iostream> 2 #include<sstream> 3 #include<stdlib.h> 4 #include<string> 5 using namespace std; 6 class Solution { 7 public: 8 int addDigits(int num) { 9 int i; 10 int digit; 11 int sum; 12 string str = int2str(num); 13 while (str.length() > 1) { 14 sum = 0; 15 for (i = 0; i < (signed) str.length(); i++) { 16 digit = str[i] - '0'; 17 sum += digit; 18 } 19 str = int2str(sum); 20 } 21 int result = atoi(str.c_str()); 22 return result; 23 } 24 25 string int2str(const int &int_temp) { 26 string string_temp; 27 stringstream stream; 28 stream << int_temp; 29 //此处也可以用 string_temp=stream.str(); 30 stream >> string_temp; 31 return string_temp; 32 } 33 };
1 class Solution { 2 public: 3 int addDigits(int num) { 4 int i; 5 int digit; 6 int sum = 0; 7 if (num / 10 != 0) { 8 string str = int2str(num); 9 for (i = 0; i < (signed) str.length(); i++) { 10 digit = str[i] - '0'; 11 sum += digit; 12 } 13 num = addDigits(sum); 14 } 15 return num; 16 } 17 18 string int2str(const int &int_temp) { 19 string string_temp; 20 stringstream stream; 21 stream << int_temp; 22 //此处也可以用 string_temp=stream.str(); 23 stream >> string_temp; 24 return string_temp; 25 } 26 };
思路2(求树根公式):
公式:a的数根b = ( a - 1) % 9 + 1
规律:任意一个整数关于9取余就等于这个整数各个位的数加在一起的数关于9取余。举例:38%9=11%9=2%9=2。2为38的数根。
因此,既可以直接采用公式法求出一个数的数根,也可以对该数进行取模运算,模9的余数即为数根。不过当余数为0时,应当返回9。
1 class Solution { 2 public: 3 int addDigits(int num) { 4 if (num == 0) 5 return 0; 6 int result = (num % 9 == 0 ? 9 : (num % 9)); 7 return result; 8 } 9 };
参考:
[2]http://blog.csdn.net/liujiayu1015/article/details/50531598?locationNum=7&fps=1