我必須製作一個程序,它執行以下操作:輸入應該是n
(n> 1)。如果n = 5,下面應該發生:在C++中拆分一個數字
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我已經說過我的英文不好,所以我不能很好地解釋它。 Wel ...任何數字n(n> 1)都可以通過合併一些較小的數字來完成。在我的示例中,5 = 1 + 1 + 1 + 1 + 1或1 + 1 + 1 + 2或.... 1 + 4或2 + 3 ..程序應該輸出所有這些可能性,而不必重複兩種同類按照非常嚴格的順序(從低到高)。 – user3236732