力扣:258. 各位相加

1、简单做法:按照题目来暴力解,双重循环求直到该数小于10

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

2、第一次优化,利用数字的规律。

因为当一个数不断各位相加直到小于10的时候输出。

那么可以考虑一下相邻的数有什么联系吗? 答案是有的,相邻的数大小都是相差1。

这里以只有两位数的数为例,其他多位的可以类推。

比如17和18,他们大小相差1,而且他们的十位相等,那么,显然他们的各位相加也是相差1,而这个1来自那个个位相差的1。

那么我们现在再来分析一下十位数不相等的,比如29,30。

30的十位比29的十位大1,由于最后要输出的是小于10的数,那么29的个位为9,当9要加1的时候就会变成10,那么10又得再次相加,最后得到了原来加进去的1,所以当一个数某个位为9的时候(我称之为“满了”),可以直接忽略,不用进行相加。

所以只需要比较他们的十位,也就是3和2,那么30各位相加也是比29各位相加大1。

为了证明一下说服力,我再举个例子,1099和1100。两个9直接省略,那,1099就剩个1,1100为2,因为除去99后,1099变成了1000,和1100仅相差了百位的1。

由此可以得到不太严谨(毕竟没有数学公式证明嘛)的结论,当一个数+1后,它的各位数相加也不断+1,且周期为9,(从1到9不断循环)

这里假设有一个数m,它的各位数为1。那么随着m不断+1,各位数相加也不断+1,所以当m增大9的时候,它各位数相加也增大9,所以变成了10,10再次各位数相加,也就是1。m继续增大,m的各位数相加再次从1开始不断增大,所以有了从1到9的不断循环。

(写了一大串,其实这个规律你多列几个出来就可以看出来了)

class Solution {
public:
    int addDigits(int num) {
        if(num==0) return 0;
        else if(num%9==0)  return 9;
        else return num%9;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值