输出正整数的所有分割

输出正整数的所有分割

同时还能解决输出正整数的分割数目的大小的问题。

输出正整数的所有分割_第1张图片

在这里,递归只是一个遍历的过程,而所要解决的问题需要在这个遍历的过程中得到解决。

思路

先假设一个递归函数 Part(Num,MaxValue) 能够遍历Num的所有极大值不大于MaxValue的分割序列,接下来我们要做的就是在这个假设的基础上实现这样一个递归函数来完成我们要求的 Part(Num,Num) 。—一定要参考上面的图片哦。

< header >

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>

using namespace std;

< Part >

static int partitons(0);

//Part能完成num的所有极大值不大于Maxvalue的分割
void Part(int const num,int const Maxvalue, vector<int>*set, vector<vector<int>*> &result){

    //end the Partition---1不可再分。
    if (num == 1) {
        set->push_back(1);
        result.push_back(set); partitons++;
        return;
    }

    //例如7=4+3,这里3<=4, 3还可以继续分割Part(3,3,set,result)。
    if (num <= Maxvalue)
    {
        set->push_back(num);
        result.push_back(set); partitons++;

        set = new  vector<int>(set->begin(), set->end()-1);//例如7=4+3, 前面两行代码已将
        //这个分割记录到了result中,接下来要新开辟一个set,并将4保存,传递给
        //Part(3,3-1,set,result),继续将3分解。

        //继续分割num, 遍历所有极大值不大于num-1的分割。
        Part(num, num - 1, set, result);

        //得到num的不大于num的全部分割,返回。
        return;

    }

    //when num>Maxvalue
    for (int i(Maxvalue); i >=1; i--){
        //当num>Maxvalue时,对Maxvalue~1之间的所有数n,
        //遍历(num-n,n)---num-n的所有极大值不大于n分割.
        //例如 7 = 6+1=5+2=4+3=3+4=2+5=1+6 
        //就拿7=3+4来说,先将3记录到set中,然后继续Part(4,3,set,result)---求出4的所有极大值
        //不大于3的分割。

        set->push_back(i);

        Part(num - i, i, new vector<int>(*set), result);

        set->pop_back();
    }

}

void Part(int const num, vector<vector<int>*> &result){

    Part(num, num, new vector<int>(), result);

}

< main >

int main(){

    vector<vector<int>*> result;
    int n;
    cout << "请输入想要分割的正整数n:" << endl;
    cin >> n;

    Part(n,result);
    cout << "所有分割的结果:" << endl;
    cout << endl;
    for (int i(0); i < result.size(); i++){
        cout << "{";
        copy(result[i]->begin(),result[i]->end(),ostream_iterator<int>(cout));
        cout << "}";
        cout << endl ;
    }
    cout << endl;
    cout << "划分数目:" << partitons<< endl;
    cout << endl;
    system("pause");

    return 0;
}

< 结果 >

输出正整数的所有分割_第2张图片

你可能感兴趣的:(输出正整数的所有分割)