leetcode:258. 各位相加

题目来源

题目描述

在这里插入图片描述

题目解析

这道题让我们求数根,所谓树根,就是将大于10的数的各个位上的数字相加,若结果还大于0的话,则继续相加,直到数字小于10为止。

模拟

class Solution {
public:
    int addDigits(int num) {
        while (num > 9){
            int sum = 0;
            while (num != 0){
                sum += (num % 10);
                num = num / 10;
            }
            num = sum;
        }
        return num;
    }
};

找规律

那么我们先来观察1到20的所有的树根:

1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8    
9    9    
10    1
11    2
12    3    
13    4
14    5
15    6
16    7
17    8
18    9
19    1
20    2
  • 观察发现规律,每9个一循环,所有大于9的数的树根都是对9取余,也就是x % 9
    • 如果当前数不是9的倍数,那么可以写成: x % 9
    • 如果当前数是9的倍数,得到的应该是9的本身,但是按照上面的数字得到的时0。为了兼容这种情况,可以写成:(n-1)%9+1
    • 这时还需要处理一个特殊情况,那就是n = 0时,会出现 -1 % 9 所以我们要特判
class Solution {
public:
    int addDigits(int num) {
        return (num == 0) ? 0 : (num - 1) % 9 + 1;
    }
};

类似的题目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值