【问题标题】:Splitting a number in c++在 C++ 中拆分一个数字
【发布时间】: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


【解决方案1】:

编辑:我重写了 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 &gt; 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;
}

【讨论】:

  • 嘿,非常感谢!我无法形容你有多大帮助!虽然我在我的问题中犯了一个小错误......我也应该以相反的顺序得到原始的线条......从最低到最高......我会尽快在我的问题中改变我想要的输出.你能帮我吗?提前致谢!
  • 该死..我应该再问一个问题吗?
  • @user3236732 为新问题规范重写。
  • mp[0] = 1; 行给出了一个未处理的异常:访问冲突写入位置。当我输入内容并单击输入时,控制台冻结:?
  • @user3236732 我没有注意到您已将 mp 替换为指针。我又编辑了一遍。这次它应该像ideone.com/pbBgFy 中所示的那样工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 2012-03-23
  • 2018-08-15
相关资源
最近更新 更多