所有数字的总和,直到它在java中变成一位数,复杂度为o(1)?

所有数字的总和,直到它在java中变成一位数,复杂度为o(1)?,java,logic,complexity-theory,Java,Logic,Complexity Theory,我从亨利那里找到了答案 int sum = n % 9; if (sum == 0) sum = 9; 这里 有人能解释一下加法和余数的关系吗 我的逻辑也会如下,这也是在上面的链接中提到的 int sum = 0; while (n > 9 ) { sum=0; while (n > 0) { int rem; rem = n % 10; sum =

我从亨利那里找到了答案

int sum = n % 9;
if (sum == 0) sum = 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;
    }

但是两行答案是非常棒的。

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

现在谈谈你的主要问题:

有谁能解释一下加法和余数是怎么回事吗 相关的

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

证明

nk、…、n2、n1、n0
为数字
n
k+1

10^p
表示
p
的10次方

然后

现在请注意,最后一行是数字
n

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

可以被9整除,因为所有
p>0
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;如果(总和=0)总和=9
 S1 = (10^k - 1) * nk + ... + (100-1) * n2 + (10-1) * n1
  n % 9 = S(n) % 9 = S(S(n)) % 9 = ...