C ++程序输出问题

时间:2010-12-10 01:02:36

标签: c++ arrays recursion

Example: Let’s say your user input is 6.

Then the number of sequences that sum up to 6 is 11 (including 6 itself). This is shown clearly below:

6
5+1
4+1+1
3+1+1+1
2+1+1+1+1
1+1+1+1+1+1
2+2+1+1
3+2+1
4+2
2+2+2
3+3

You SHOULD NOT have any sequences that repeat. You cannot have 2+2+1+1 and 1+1+2+2 as two different combinations!!

CODE:

#include <iostream>

using namespace std;

int sum(double number, int min, int & counter)
{
    int temp=0, n;
    n=number+temp;
    if ((number>=(n/2)) & (number!=0))
    {
        number --;
        temp ++;
        while (number>=(n/2))
        {
            cout << number << "+"<< temp << "\n";
            number --;
            temp ++;
            counter ++;
        }
    }
    else if (number==0)
    {
        return 0;
    }

    sum(n-min, 1,counter);

    return 0;
}

int main()
{
    int number, counter=1;


    cout << "Please enter the number: ";
    cin >> number ;
    cout << "\n";

    sum(number, 1, counter);
    cout << counter;

    return 0;
}

我的输出是

6
5+1
4+1+1
3+1+1+1
2+1+1+1+1
1+1+1+1+1+1
2+2+1+1
3+2+1
3+1+2
2+3+1
4+2
2+2+2
3+3
0+1

Total out is 13. 

真实输出,对于那些不喜欢上面发布的人来说,这是一个较短的版本。

5+1
4+2
3+3
4+1
3+2
2+3
3+1
2+2
2+1
1+2
1+1
0+1

13

Where 1+2 and 2+3 are doubles as listed above.

这里有什么问题吗?

4 个答案:

答案 0 :(得分:4)

我想如果你总结得更容易,那么第一个加数总是最高的,而你不允许两个相邻的加数,第二个加数大于第一个加数。

只是一个想法...

答案 1 :(得分:2)

我在上一个问题中已经发布了一个解决方案:

void sum_r(int n, int m, int cnt, int* nums){
    for (;n >= m; m++)
        sum_r(n-m, nums[cnt] = m, cnt+1, nums);
    if (!n) for (int i=0; i<cnt; i++) printf("%d%c",nums[i],(i==cnt-1)?'\n':'+');
};

void sum(int n){
    int nums[100];
    return sum_r(n, 1, 0, nums);
};

int main(){
    sum(6);
    return 0;
};

编辑:我会尝试更好地解释它。主要思想是对生成的序列强加一个命令,这有助于避免重复 我们将使用min参数,它将是我们从现在开始可以在序列中使用的最小可能术语。
函数sum_r只在每个递归级别打印min的值序列 num术语用作一种累加器,或者值为“备用”。

我们可以编写一个简单的函数,只计算这些序列的数量:

int sum_c(int n, int m){ 
    if (!n) return 1; // termination condition. end of sequence reached with "perfect match". this means we have found 1 additional sequence. Note that it's the only way of adding new values to result.
    int comb_cnt = 0;
    while (n >= m) { // we need a stop condition, and there is no point in having negative value of (n - m)
         comb_cnt +=   // here we accumulate all the solutions from next levels
            sum_c(n-m, m); // how many sequences are for current value of min?
         m++; // trying a larger `min`
    };
    return comb_cnt; // number of sequence fond at this level
};

答案 2 :(得分:0)

这是一个提示:问题是计算输入数字的partitions。另见:partition function

答案 3 :(得分:0)

C ++中的逻辑AND运算符是&&,而不是&,就像你在这行中一样:

if ((number>=(n/2)) & (number!=0))