如果给出数字作为输入,请找到该数字之前所有数字的总和
例如输入11则答案为1 + 2 .... + 9+(1 + 0)+(1 + 1)蛮力方法是计算所有小于a的数字的数字总和我已经实现了该方法,我想知道是否还有其他方法可以在不实际计算每个数字的位数总和的情况下
您可以更快地执行此操作(在O(log n)操作中)。我们S(n)是所有数的数字之和0 <= k < n。然后
S(n)
0 <= k < n
S(10*n) = 10*S(n) + 45*n
因为在小于的数字中10*n,每个数字都k < n作为数字的开头部分出现10次,最后一位数字0, 1, ..., 9。这样一来,最后几位数字的总和即为45,而最后几位数字的总和为10倍k。
10*n
k < n
0, 1, ..., 9
k
相反,我们发现
S(n) = 10*S(n/10) + 45*(n/10) + (n%10)*DS(n/10) + (n%10)*((n%10)-1)/2
DS(k)的纯数字总和在哪里k。前两项来自上面,其余两项来自的数字总和n - n%10, ..., n - n%10 + (n%10 + 1)。
DS(k)
n - n%10, ..., n - n%10 + (n%10 + 1)
开始是S(n) = 0为了n <= 1。
S(n) = 0
n <= 1
要包含上限,请称为S(n+1)。
S(n+1)