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?

这题挺简单的,可是要我上来就用O(1)的方法,还是得分析一下,这种情况还能线性得到答案只有一种可能,结果可以用一行固定的公式表示,也就是结果存在显然的规律。

方法一:简单递归recursion

就是把结果循环递归直到计算出一位数返回。

int addDigits(int num) {
    if (num/10 == 0) return num;
    int temp, sum = 0;
    while (num) {
        sum += num % 10;
        num = num / 10;
    }
    return addDigits(sum);
}
方法二:公式推导

找这种公式其实就是找规律,而且这种答案在固定范围的,例如这题答案在0-9这几种可能的,多半有结果循环的可能。写几组数试试看会发现,除了0之外,结果始终在1到9循环。显然,这是个对9取余的问题,怎么表示结果并考虑特殊情况是写的时候需要注意的。对9取余,若是9的倍数,余数为0,此时结果应该为9,这是一个,还有就是单独考虑0的结果是0。
简单代码如下:

int addDigits(int num) {
    if (num == 0) return 0;
    else {
        int rmd = num % 9;
        return (rmd == 0)? 9 : rmd;
    }
}

后来看了看链接的Wikipedia,这种规律被总结为:
sum_digits = n - 9 * floor( (n - 1) / 9);

也就是:

int addDigits(int num) {
    return num - 9 * ((num - 1) /9);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值