Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中的一个数的分裂_C++_Function_Split_Numbers - Fatal编程技术网

C++中的一个数的分裂

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

我必须做一个程序,它可以做以下工作:输入应该是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;
}
编辑:我重写了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;
}