java查找n+1、n+2的数字之和。。。。当n的位数之和给定时
我们可以很容易地计算一个给定数字的数字之和,但是有没有什么数学公式或模式可以用来确定下一个数字的和,而不必一次又一次地求所有数字的和
比如说
Sum of 1234 = 1+2+3+4 = 10
Sum of 1235 = 1+2+3+5 = 11
Sum of 1236 = 1+2+3+6 = 12
我可以在这里看到某种模式,但无法想出任何有效的数学算法
我使用以下方法计算数字的总和:
public int sum(long n) {
int sum = 0;
while (n != 0) {
sum += n % 10;
n /= 10;
}
return sum;
}
这工作正常,但它是CPU密集型。我想做得更快。如果我有一个数字序列,比如说10->19
,我应该只需要计算10的数字,然后每个数字加一,直到19
如果我已经有了以前数字的总和,有没有有效的方法来计算数字的总和
# 1 楼答案
让我们来表示数字
n
的位数之和是s(n)
s(49) = 13
s(94) = 13
但是{}哪个{},而{}哪个{}。因此,如果只给出
n
的数字之和是13,那么n+1
的数字之和至少有两个不同的可能答案您需要一些关于n的附加信息我认为关键在于知道如果n以9结尾,
s(n+1)
最多是s(n)-9。(啊,这就是ypercube的答案。)因此,如果您有xxxx9(其中最后一个x不是9),s(xxxx9 + 1) = s(xxxx9) - 9 + 1
。如果您有xxx99、s(xxx99 + 1) = s(xxx99) - 18 + 1
等所以,如果你把你的射程中的10、100、数千等等都数一数,这可能会加快速度
(再一次,我看到ypercube把我揍了一顿)。看起来A037123的公式就是这么做的(但是从0到n)。(我们称之为
a(n)
)最后,因为你想要的是从n到n+r的数字之和,而不是从1到n的数字之和,我们需要看看我们是否能推导出一个
ss(n,n+r)
范围内数字之和的公式那看起来很简单
ss(n,n+r) = a(n+r) - a(n-1)
# 2 楼答案
如果您不想查找
t
个连续数的数字,而是要查找t
个连续数(n+1,n+2,…,n+t)的数字之和,则更简单其中
a(i)
是整数序列百科全书中的A037123序列,它有几个公式。我想这会很快:# 3 楼答案
这是来自wikipedia的公式:
![This is the formula](https://i.stack.imgur.com/XKV79.png)
这是我的Java实现:
# 4 楼答案
最快的方法是提取每个数字,并在进行时添加
印刷品
对于较大的值,它可以节省约70纳秒。这会增加代码的复杂性。您必须使用第一个sumDigit来引导总和,因为您不能从1一直数到10^18