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

Posted

技术标签:

【中文标题】所有数字的总和,直到它在java中变成单个数字,复杂度为o(1)?【英文标题】:Sum of all the digits till it becomes single digit in java with o(1) complexity? 【发布时间】: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 行答案很棒。

【问题讨论】:

【参考方案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;

以上是关于所有数字的总和,直到它在java中变成单个数字,复杂度为o(1)?的主要内容,如果未能解决你的问题,请参考以下文章

编辑数字直到达到总和值

递归:数字的总和,直到剩下一位数

java 添加7或9的倍数的所有数字,最多为600.确保63之类的数字仅在总和中添加一次。

Java:带循环的数组

牛牛想对一个数做若干次变换,直到这个数只剩下一位数字。 变换的规则是:将这个数变成 所有位数上的数字的乘积。比如285经过一次变换后转化成2*8*5=80. 问题是,要做多少次变换,使得这个数变成个位

获取JAVA中的数字总和