C++中的一个数的分裂
我必须做一个程序,它可以做以下工作:输入应该是n>1。如果n=5,则应发生以下情况:C++中的一个数的分裂,c++,function,split,numbers,C++,Function,Split,Numbers,我必须做一个程序,它可以做以下工作:输入应该是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> #incl
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;
}
编辑:我重写了devNum和main以适应新的规范。请注意,我更改了mp[0]中填写的值
进入
进入
并将main写为
请评论/解释你的代码:在这过程中它应该做什么。@ScottHunter我已经说过我的英语不好,所以我不能很好地解释它。好的。。。任何n>1的数字都可以通过组合一些较低的数字来实现。在我的例子中,5=1+1+1+1或1+1+1+2或。。。。1+4或2+3。。该程序应该输出所有这些可能性,而不必以从低到高的严格顺序重复相同类型的两个。嘿,非常感谢!我无法形容你有多大的帮助!虽然我在问题上犯了一个小错误。。。我应该把画的线条按相反的顺序画出来。。。从最低到最高。。我会尽快在我的问题中更改我想要的输出。你也能帮我吗?提前谢谢!该死的。。我应该再问一个问题吗?@user3236732为新问题spec.mp[0]=1重写;第行给出一个未处理的异常:访问冲突写入位置。当我输入一些东西并单击“输入”时,控制台冻结:?@user3236732我没有注意到您已将mp替换为指针。我又编辑了一遍。这一次,它应该如中所示工作
void devNum(unsigned n, unsigned pos)
{
for (mp[pos] = mp[pos-1]; mp[pos] <= n; ++mp[pos])
{
if(mp[pos] != n)
{
devNum(n - mp[pos], pos + 1);
}
else
{
if (pos > 1) print(pos);
}
}
}
int main(void)
{
unsigned n;
cin >> n;
mp = new unsigned[n+1];
mp[0] = 1;
devNum(n, 1);
delete [] mp;
return 0;
}
void devNum(unsigned n, unsigned pos)
{
unsigned k;
for (k = n; k >= 1; k--)
/* ... */
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);
}
}
}
const int MAX = 100;
unsigned mp[MAX + 1];
unsigned *mp;
int main(void)
{
unsigned n;
cin >> n;
mp = new unsigned[n+1];
mp[0] = n + 1;
devNum(n, 1);
delete [] mp;
return 0;
}