我对微软采访中的一个问题感到困惑,如下所示:
一个函数应该接受一个范围(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#中形成这个序列吗?
谢谢,马赫什
所以这是一个直截了当/天真的答案(在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)