将一个给定数字的所有位相加直到数字最后只剩下一位的算法

发布于 2022-09-02 10:18:41 字数 1000 浏览 22 评论 0

原题:

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.

看了一下别人的时间复杂度 O(1) 的解法:

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

我的理解大致如下:

假设一个数字为 abcd,那么:

(a + b + c + d) % 9
= (999a + 99b + 9*c + a + b + c + d) % 9
= abcd % 9

而 (a + b + c + d) 得到的一个数,我们假设为 n,那么

abcd % 9
= n % 9;

而 n 可以递归到直到最后只剩下一位数字,假设这个数字为 k,那么就有

result = (k % 9 == 0) ? 9 : (k % 9);

也就是说,数字 abcd 可以转化为:

result = (num == 0) ? 0 : ((num % 9 == 0) ? 9 : (num % 9));

但是总感觉理解上有一些奇怪,也不知道有没有错误,求各位大神能给出一个较为清晰的算法正确性证明。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别念他 2022-09-09 10:18:41

你的证明是正确的。但是再梳理一下,反过来描述可能更容易理解。

假设n>0,按照题目要求的计算步骤最后得到的结果为k,那么当且仅当k==9k%9=0,其他情况下k%9=k

而任何数x与它的各位数字之和y之间都满足x%9==y%9,这个结论在你的证明中已经很明确了,理解起来应该没有问题。

所以应用该结论可以得到n%9==k%9,当该结果为0k==9,否则k==n%9

上面是n>0的情况,当n==0时,结果当然为0。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文