在C 中分配数字

Splitting a number in c++

本文关键字:数字 分配      更新时间:2023-10-16

我必须制作一个程序,该程序执行以下操作:输入应为 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("%un", 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]中填充的值。

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);
        }
    }
}

请注意,我在调用print()之前检查pos > 1以避免单个5

要删除固定的MAX限制,您可以在main()中动态分配mp。也就是说,更改

const int MAX = 100;
unsigned mp[MAX + 1];

进入

unsigned *mp;

并将main()写为

int main(void)
{
    unsigned n;
    cin >> n;
    mp = new unsigned[n+1];
    mp[0] = n + 1;
    devNum(n, 1);
    delete [] mp;
    return 0;
}