所有数字的总和,直到它在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
成为号码n
的k+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 > 0
,10^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之类的数字仅在总和中添加一次。
牛牛想对一个数做若干次变换,直到这个数只剩下一位数字。 变换的规则是:将这个数变成 所有位数上的数字的乘积。比如285经过一次变换后转化成2*8*5=80. 问题是,要做多少次变换,使得这个数变成个位