假设您有号码1,...,n。现在,将它们的总和 1 + 2 + ... + n 表示为 S。如果我们将缺失的数字表示为j,将重复的数字表示为k,我们将得到修改后的总和S' = S - j + k,所以这是两个变量的一个方程。我们可以重复相同的过程,但这一次,求和二次幂,即S_2 = 1 + 4 + ... + n^2。对于缺少一个数字和一个重复数字的序列,结果将为S_2' = S_2 - j*j + k*k。因此,我们得到两个变量的两个方程。
总的来说,我们有:
S' = S - j + k
S_2' = S_2 - j*j + k*k
因此
k - j = S' - S =: a
k*k - j*j = S_2' - S_2 =: b
我们引入符号a 和b 以简化符号。
现在,k*k - j*j = (k - j)*(k + j),因此:
k - j = a
k*k - j*j = a * (k + j) = b
将两个方程相加得到:
2*k = b/a + a
2*j = b/a - a
对于您的特定示例:
S = 1 + 2 + 3 + 4 + 5 = 15
S_2 = 1 + 4 + 9 + 16 + 25 = 55
对于缺少一个元素和一个重复元素的系列:
S' = 5 + 2 + 1 + 4 + 5 = 17
S_2' = 25 + 4 + 1 + 16 + 25 = 71
然后:
a = S' - S = 2
b = S_2' - S_2 = 16
因此:
2*k = 8 + 2 = 10
2*j = 8 - 2 = 6
给出:
k = 5, j = 3
在实践中(如@HermanTheGermanHesse 所述),可以根据n 中的多项式(所谓的Faulhaber 公式)获得S 和S_2 的封闭形式expressions,即: S = n*(n+1)/2 和 S_2 = n*(n+1)*(2*n+1)/6。因此只需遍历输入数据一次,累积S' 和S_2',并使用上面给出的k 和j 的公式...