使用连续数字形成一个数字

Mah*_*esh 8 numbers generator

我对微软采访中的一个问题感到困惑,如下所示:

一个函数应该接受一个范围(3 - 21),它应该打印所有连续的数字组合,形成如下给出的每个数字:

3  = 1+2
5  = 2+3
6  = 1+2+3
7  = 3+4
9  = 4+5
10 = 1+2+3+4
11 = 5+6
12 = 3+4+5
13 = 6+7
14 = 2+3+4+5
15 = 1+2+3+4+5
17 = 8+9
18 = 5+6+7
19 = 9+10
20 = 2+3+4+5+6
21 = 10+11
21 = 1+2+3+4+5+6

你能帮我在C#中形成这个序列吗?

谢谢,马赫什

Tom*_*ith 5

所以这是一个直截了当/天真的答案(在C++中,没有经过测试;但你应该能够翻译).它使用的事实

1 + 2 + ... + n = n(n + 1)/ 2,

你以前可能见过的.这里可以进行许多简单的优化,为清楚起见,我省略了这些优化.


void WriteAsSums (int n)
{
  for (int i = 0; i < n; i++)
  {
    for (int j = i; j < n; j++)
    {
      if (n = (j * (j+1) - i * (i+1))/2) // then n = (i+1) + (i+2) + ... + (j-1) + j
      {
        std::cout << n << " = ";
        for (int k = i + 1; k <= j; k++)
        {
          std::cout << k;
          if (k != j) // this is not the interesting bit
            std::cout << std::endl;
          else
            std::cout << " + ";
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)