【问题标题】:Sum of all the digits till it becomes single digit in java with o(1) complexity?所有数字的总和,直到它在java中变成单个数字,复杂度为o(1)?
【发布时间】:2016-11-08 17:24:06
【问题描述】:

我从亨利那里找到了答案

int sum = n % 9;
if (sum == 0) sum = 9;

这里

java program that sums up the digits of a number until it is a single number Eg: 2748303 = 2+7+4+8+3+0+3 = 27 = 2+7 = 9

谁能解释一下加数和余数的关系?

我的逻辑也应该如下,上面的链接也提到了

int sum = 0;
    while (n > 9 ) {
                 sum=0;
        while (n > 0) {
            int rem;
            rem = n % 10;
            sum = sum + rem;
            n = n / 10;
        }
        n = sum;
    }

但是 2 行答案很棒。

【问题讨论】:

    标签: java logic complexity-theory


    【解决方案1】:

    在 Java 中,整数的范围有限,因此提醒具有 O(1) 渐近复杂度。

    现在是您的主要问题:

    谁能解释一下如何添加数字和余数 有关系吗?

    首先请注意,任何数字n 在除以9 作为其数字总和时都有相同的提醒。如果这看起来不是很明显,这里是一个证明的草图。

    证明

    nk,...,n2,n1,n0 成为号码nk+1 数字。

    10^p 表示p 的10 次方。

    然后

    n = 10^k * nk + ... + 100 * n2 + 10 * n1 + n0 =
      = (10^k - 1) * nk + ... + (100-1) * n2 + (10-1) * n1 +
        + nk + ... + n2 + n1 + n0
    

    现在注意最后一行是数字n的数字总和

      S0 = nk + ... + n2 + n1 + n0
    

     S1 = (10^k - 1) * nk + ... + (100-1) * n2 + (10-1) * n1
    

    可以被 9 整除,因为对于所有 p > 010^p - 1 = 9...9 可以被 9 整除。

    由于n = S1 + S0 且 S1 可被 9 整除,因此 S0 % 9 = n % 9。

    这就是我们想要证明的

    现在让S(n) 表示返回数字n 的数字总和的函数,那么正如我们刚刚观察到的那样

      n % 9 = S(n) % 9 = S(S(n)) % 9 = ...
    

    我们可以继续处理,直到我们达到一个数字。

    这就是提醒和数字总和的关系。

    【讨论】:

    • 正如你提到的,这只是证明n%9 = S*(n)%9。它并不能证明 n%9 和 S(n) 是相同的,因为它们实际上不是(有 9 != 0 的情况)。然而,S(n) 等于 (n-1)%9+1。
    • @andresp 这点不错,原帖中已经处理了:int sum = n % 9; if (sum == 0) sum = 9;
    猜你喜欢
    • 2014-05-18
    • 2022-08-20
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多