c++ 整数n分成k份 递归实现

来源:互联网 发布:淘宝管家官方下载 编辑:程序博客网 时间:2024/05/17 02:22

最近学到了递归的用法,在课堂上感受到递归的魅力,课后做了这道练习,怎样把整数n分成k份,一开始,只是统计总情况数,后来改进下,顺便输出所有的情况。

写个博客,记录下。

//

//  main.cpp

//  整数n分成k

//

//  Created by scnulpc on 2017/6/13.

//  Copyright © 2017 scnulpc. All rights reserved.

//


#include <iostream>

#include <stdio.h>

using namespace std;

#define Max 100

int parts;

//整数n分成k份,不考虑顺序,譬如把3分成2份,1 2  2 1 是同一种情况。 统计所有情况

int divideNtoKpart(int n,int k,int start)//n:整数,k:分成k start:start开始分类

{

    if (k==1) {

        return 1;

    }

    int sum=0;

    for (int i=start; i<=n/k; i++) {

        sum = sum + divideNtoKpart(n-i, k-1, i);

    }

    return sum;

}

//统计情况并输出所有情况

int divideNtoKpartAndPrintAllConditions(int n,int k,int start,int condition[Max],int index)

{       //n:整数,k:分成k start:start开始分类 数组condition[Max]:存储分类的情况  index:数组下标,0开始

    if (k==1) {

        condition[index]=n;

        for (int m=0; m<parts; m++) {

            cout<<condition[m]<<" ";

        }

        cout<<endl;

        return 1;

    }

    int sum=0;

    

    

    for (int i = start; i<=n/k; i++) {

        condition[index]=i;

        sum = sum + divideNtoKpartAndPrintAllConditions(n-i, k-1, i, condition, index+1);

        

    }

    return sum;

}

int main(int argc, const char * argv[]) {

    // insert code here...

    

    int n=0,k=0;

    int conditions[Max];

    cout<<"输入整数n"<<endl;

    cin>>n;

    cout<<"输入份数k"<<endl;

    cin>>k;

    parts=k;

    cout<<divideNtoKpartAndPrintAllConditions(n, k, 1, conditions, 0)<<""<<endl;

    return 0;

}


原创粉丝点击