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 = 111 + 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 };

参考:

[1]http://baike.baidu.com/link?url=r20G5GiY29IGMYSo5PoxQysBr7EfXlo2boA2NVLYD40mzAgBELHgmyFSuL4hhACso3B2v1GQ5OcLi-qkNzwjwa

[2]http://blog.csdn.net/liujiayu1015/article/details/50531598?locationNum=7&fps=1

原文地址:https://www.cnblogs.com/sindy/p/6581197.html