所有数字的总和,直到它成为具有o(1)复杂度的java中的单个数字?

时间:2016-07-06 15:23:25

标签: java logic complexity-theory

我从Henry那里找到了答案

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行答案很棒。

1 个答案:

答案 0 :(得分:2)

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

现在回答你的主要问题:

  

任何人都可以解释如何添加数字和余数   相关?

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

<强>证明

nk,...,n2,n1,n0成为数字k+1的{​​{1}}位数。

n表示10^p - 10的幂。

然后

p

现在请注意,最后一行是数字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

可以被9整除,因为对于所有 S1 = (10^k - 1) * nk + ... + (100-1) * n2 + (10-1) * n1 10^p - 1 = 9...9可以被9整除。

由于p > 0和S1可被9整除,因此S0%9 = n%9。

这就是我们想要证明的内容

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

n

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

这是提醒和数字之和相关的方式。