给定一个数字 N 并生成一个差为 1 的算术级数,以便在求和到有限元后给出数字 N 例如:
For Example:
N=10
1 + 2 + 3 + 4 =10
N=20
2+3+4+5+6 = 20
N=30
4+5+6+7+8 = 30
N < 1000000
从总和 = 0 开始。
设 1 为当前数字。
将当前数字加到总和中。
如果sum > N
,则从添加到总和的第一个数字中减去数字,直到sum <= N
。
sum = N
如果(成功)则停止。
增加当前数量。
从步骤 3 继续。
您只需要记住第 4 步加到总和中的第一个数字,当您从总和中减去它时,您将加一(感谢 Niko)。
作为优化,你也可以使用公式n(n+1)/2
(N
例子:
N = 30
Sum = 0
Add 1 -> 1
Add 2 -> 3
Add 3 -> 6
Add 4 -> 10
Add 5 -> 15
Add 6 -> 21
Add 7 -> 28
Add 8 -> 36
36 > 30, so:
Subtract 1 -> 35
Subtract 2 -> 33
Subtract 3 -> 30
Done.
设 T 为数字
所以 N(N+1)/2 = T 在你的第一种情况下 N=4
N(N+1)/2 - K(K+1)/2 = T 在你的第二种情况下 N=6 & K=1
N(N+1)/2 - K(K+1)/2 = T 在你的第三种情况下 N=8 & K=3
所以你解决 N 基本上就是通过乘法和减少你得到
N^2 + N - (2T + K^2 + K) = 0
对 N 应用二次公式,即 N= (-b + sqrt(b^2 - 4ac))/2a
所以我们得到,N = (-1 +- sqrt(1 + 8T + 4K^2 + 4K))/2
N 必须是正数,所以我们可以删除负数情况
因此 N 必须等于 N = (sqrt(8T + (2k+1)^2) - 1)/2 你可以从 K=0 迭代直到你得到一个自然数 N 这将是你的答案
希望它有所帮助,我正在尝试找到一种更好的方法,因为我正在这样做(欣赏有趣的问题)
让N = pq
wherep
是一个奇数的正整数并且q
是任何正整数。
(1) 你可以写成连续整数N
的总和,用作为中间值。p
q
(2) 如果p
和q
都是奇数(比如q = 2k+1
),你也可以写成N
连续2p
整数之k
和k+1
,中间有 和。
例如,让N = 15 = 5 x 3
.
如果我们选择p=5
,则遵循规则 (1) 我们有1+2+3+4+5 = 15
。或者根据规则 (2) 我们也可以写(-3)+(-2)+(-1)+0+1+2+3+4+5+6 = 15
.
我们也可以选择p = 3
get4+5+6 = 15
和0+1+2+3+4+5 = 15
too。
int NumSum(int val)
{
int n = 0, i = 0, j;
while (n != val)
{
n = 0;
j = ++i;
while (n < val)
n += j++;
}
return i;
}
没有花哨的数学,只是简单的方法。返回数字开始计数。
这更像是一种技巧方法,我认为它可能会起作用。
假设数字是 10,然后从 n/2 开始一个序列,即 5 现在该序列不能
5+6,因为 10>11,所以我们必须向后工作,5 是我们需要考虑的数字的上限,因为像 6+7 等数字将超过 10,所以序列的最后一个数字(最高)将是 5。向后 5+4=9 < 10
5+4+3=12 > 10 所以删除第一个元素有点像队列。
所以对于 20 我们有 start = 20/2 = 10
我想这是对已接受答案的一种变体,但仍然认为我可以将其添加为替代解决方案。
首先,每个奇数都是 AP 长度 2 的总和,因为n = floor(n/2) + ceil(n/2)
.
更有趣的是,具有奇数除数 d 的数是 AP 长度 d(差为 1)的和n/d
。例如,30 可以被 5 整除,AP 的总和也可以被 5 整除:30 = 4 + 5 + 6 + 7 + 8
。
没有奇数除数的数字是 2 的幂。虽然1 = 0 + 1
和 2 = -1 + 0 + 1 + 2
,但更大的幂不是任何(非平凡)算术级数的总和。为什么?假设2**m = a + (a+1) + .. + (a+k-1)
。对系列求和= k (2a + k-1) / 2
。k 必须是奇数或偶数,但任一选择都与 2 的幂的和相矛盾。