所有数字的总和,直到它在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 = ...