如何生成总和等于N的连续序列

Sat*_*tel 7 algorithm math

给定数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
Run Code Online (Sandbox Code Playgroud)

N <1000000

Duk*_*ing 7

  1. 以sum = 0开头.

  2. 设1为当前数字.

  3. 将当前数字添加到总和中.

  4. 如果sum > N,从第一个数字中减去数字加到总和中直到sum <= N.

  5. 如果sum = N(成功)停止.

  6. 增加当前数量.

  7. 从第3步继续.

你只需要记住第4步中加入总和的第一个数字,当你从总和中减去它时,你将增加1(感谢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.
Run Code Online (Sandbox Code Playgroud)


Ram*_*eya 5

设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这将是你的答案

希望它有所帮助,Iam试图找到一个更好的方式,因为我这样做(欣赏有趣的问题)