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

时间:2013-09-27 12:19:30

标签: 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

N<百万

6 个答案:

答案 0 :(得分:7)

  1. 以sum = 0开头。

  2. 设1为当前数字。

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

  4. 如果sum > N,请将sum <= N之前添加到总和的第一个数字中的数字减去。

  5. 停止sum = N(成功)。

  6. 增加当前数量。

  7. 从第3步继续。

  8. 你只需要记住第4步加上第一个数字,当你从总和中减去它时,你将增加1(感谢Niko)。

    作为优化,您还可以使用a formula (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.
    

答案 1 :(得分:5)

设T为数字

所以N(N + 1)/ 2 = T在你的第一种情况下,其中N = 4

N(N + 1)/ 2 - K(K + 1)/ 2 = T在你的第二种情况下,其中N = 6&amp; K = 1

N(N + 1)/ 2 - K(K + 1)/ 2 = T在你的第三种情况下,其中N = 8&amp; K = 3

所以你基本上通过乘以&解;减少你得到

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试图找到一个更好的方式,因为我这样做(欣赏有趣的问题)

答案 2 :(得分:2)

N = pq其中p是一个奇数正整数,q是任何正整数。

(1)您可以将N写为p个连续整数的总和,并将q作为中间值。

(2)如果pq都是奇数(例如,q = 2k+1),您还可以将N写为连续2p的总和整数,中间有kk+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来获取4+5+6 = 150+1+2+3+4+5 = 15

答案 3 :(得分:2)

int NumSum(int val)
{
    int n = 0, i = 0, j;
    while (n != val)
    {
        n = 0;
        j = ++i;
        while (n < val)
            n += j++;
    }
    return i;
}

没有花哨的数学,只是简单的方法。返回数字开始计数。

答案 4 :(得分:1)

这更像是一种技巧方法&amp;我认为它可能会奏效。

假设数字为10然后从n / 2开始一个序列,即5 现在序列不能

5 + 6从10> 11因此我们必须向后工作5也是我们需要考虑的数字的上限,因为像6 + 7等的数字将超过10所以序列的最后一个数字(最高)将是5。 向后移动5 + 4 = 9&lt; 10

5 + 4 + 3 = 12> 10所以删除第一个元素有点像队列。

所以20岁了 start = 20/2 = 10

  1. 10 + 9 = 19 - &gt;什么都不做
  2. 10 + 9 + 8 = 27 - &gt;删除第一个元素10
  3. 9 + 8 + 7 = 24 - &gt;删除9
  4. 8 + 7 + 6 = 21 - &gt;删除8
  5. 7 + 6 + 5 = 18 - >什么都不做
  6. 7 + 6 + 5 + 4 = 22 - &gt;删除7
  7. 6 + 5 + 4 + 3 = 18 - >什么都不做
  8. 6 + 5 + 4 + 3 + 2 = 20 - >我们需要的答案
  9. 我想这是对已接受答案的一种变化,但仍然认为我可以将其作为替代解决方案添加。

答案 5 :(得分:0)

首先,每个奇数是AP长度2的总和,因为n = floor(n/2) + ceil(n/2)

更有趣的是,具有奇数除数d的数字是n/d附近的AP长度d(差值1)的总和。例如,30可以被5整除,AP的总和也是6: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的幂相矛盾。