【发布时间】:2014-01-26 15:14:04
【问题描述】:
我必须编写一个执行以下操作的程序:输入应该是n (n>1)。如果 n = 5,则应发生以下情况:
1 1 1 1 1
1 1 1 2
1 1 2
1 1 3
1 4
2 3
如您所见,没有两条相同的行,并且顺序很严格 - 从最低数字到最高数字。
我有一个代码,在同样的情况下,它会输出:
1 1 1 1 1
2 1 1 1
2 2 1
3 1 1
3 2
4 1
如您所见,顺序颠倒了,这是无意的。我该如何解决这个问题?
代码如下:
#include <iostream>
#include <stdio.h>
using namespace std;
unsigned *mp;
void print(unsigned length)
{
unsigned i;
for (i = 1; i < length; i++) printf("%u ", mp[i]);
printf("%u\n", mp[length]);
}
void devNum(unsigned n, unsigned pos)
{
unsigned k;
for (k = 1; k <= n; k++)
{
if (n != k)
{
mp[pos] = k;
if (mp[pos] <= mp[pos - 1])
{
devNum(n - k, pos + 1);
}
}
else
{
mp[pos] = k;
if (pos > 1 && mp[pos] <= mp[pos - 1]) print(pos);
}
}
}
int main(void)
{
unsigned n;
cin >> n;
mp = new unsigned[n + 1];
mp[0] = n + 1;
devNum(n, 1);
delete[] mp;
return 0;
}
【问题讨论】:
-
请评论/解释您的代码:它应该在此过程中做什么。
-
@ScottHunter 我已经说过我的英语不好,所以我不能很好地解释它。嗯...任何数字 n (n > 1) 都可以通过组合一些较低的数字来获得。在我的示例中,5=1+1+1+1+1 或 1+1+1+2 或 .... 1+4 或 2+3.. 程序应输出所有这些可能性,而无需重复两个相同类型以非常严格的顺序(从低到高)。
标签: c++ function split numbers