• 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

  • 相关阅读:
    Freemarker
    加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
    Jenkins入门
    kafka实战
    多线程文件下载
    Excel操作报表
    @Pointcut 使用@annotation 带参数
    博客园设置
    Windows下 tensorboard显示No graph definition files were found的问题解决
    通过GitHub Desktop 上传代码到github 远程仓库
  • 原文地址:https://www.cnblogs.com/sindy/p/6581197.html
Copyright © 2020-2023  润新知