整数n依次分成1份,2份,…,n份,一共有多少种情况?

比如整数3
分成1份有3,1种情况
分成2份有1 2(1 2与2 1是同一种情况),1种情况
分成3份有1 1 1,1种情况
一共就有三种情况
本人不懂计算机,需要每行都附上详细的解释说明,要通俗一点,别太专业化,谢谢啦!

这个要用递归算法来做,给个例子参考一下

#include <iostream>  //加入头文件,可认为是必备条件
#include <string>    //加入头文件,可认为是必备条件
using namespace std; //使用命名空间,就可以调用对应函数

int int_HuaFen(int n, int m);    // 定义划分函数,有两个参数n m
void show(int n, int m, string s); //定义显示函数,三个参数n m ,字符串s

int main()    //从这里开始看起
{
    string s; // 用于展示所有整数划分形式
    int n = 1; // 用于整数划分的整数

    cout << "请输入一个正整数进行整数划分:";   //输出
    cin >> n;                                 //输入

    cout << "全部划分为:" << endl;            //输出
    show(n, n, s);                            //调用show函数

    cout << "划分数为:" << int_HuaFen(n, n) << endl;  //调用划分函数

    return 0;
}

// 递归计算划分数
int int_HuaFen(int n, int m)       
{
    if (n == 1 || m == 1)        //如果输入的数为1
        return 1;           
    else if (n < m)              //如果输入的n小于m
        return int_HuaFen(n, n);  //继续调用这个函数,将大的数继续划分
    else if (n == m)              //如果相等
        return 1 + int_HuaFen(n, n - 1);  //就把其中一个减小并继续划分
    else
        return int_HuaFen(n, m - 1) + int_HuaFen(n - m, m);   //其余的情况,将把两个数划分成两组
}

// 递归展示所有划分形式
void show(int n, int m, string s) {
    if (n == 1 || m == 1) {              //若相等
        for (int i = 0; i < n - 1; i++)
            s += string("1+");
        cout << s << "1\n";
        return;
    }else if (m > n) {
        return show(n, n, s);
    }else if (n == m) {
        cout << s << n << endl;
        return show(n, m - 1, s);
    }
    if (n - m != 0)
        show(n - m, m, s + to_string(m) + string("+"));
    else
        cout << s << m << endl;
    show(n, m - 1, s);
}

img

背后的逻辑看代码不容易看懂,可以看连接https://blog.csdn.net/qq_41040550/article/details/106314376,

有用的话采纳一下呗~~谢谢

仅供参考:

#include <stdio.h>
#include <stdlib.h>
void print(int res[], int num) {
    static int L=0;
    L++;
    printf("%8d:",L);
    for (int i=0;i<num;++i) {
        printf(" %d", res[i]);
    }
    printf("\n");
}
void split(int n, int m) {// n表示总数,m表示最大因子
    static int res[100];// 保存结果
    static int num=-1;// 当前因子下标

    if (n<m || n<0 || m<1) return;
    num++;
    if (0==n) {// 递归终止条件,为0不可再分,直接输出
        print(res,num+1);
        num--;
        return;
    } else {
        if (n==m) {// 不拆,直接输出
            res[num]=m;
            print(res,num+1);
            num--;
        } else {
            // 拆分出第一个
            res[num]=m;
            n=n-m;

            if (m>n) m = n; // 最大因子不可能大于总数

            for (int i=m;i>=1;--i) {// 循环,第二个因子可以继续拆分,而且按照最大因子不同可以拆分成多个
                split(n,i);
            }
            num--;
        }
    }
}
void Split(int n) {
    if (n<=0) return;
    if (100<n) {
        printf("Up to 100\n");
        return;
    }
    for (int i=n;i>=1;--i) {
        split(n, i);
    }
}
void main(int argc,char **argv) {
         if (argc<=1) Split(5);
    else if (argc>=3) split(atoi(argv[1]),atoi(argv[2]));
    else              Split(atoi(argv[1]));
}


“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

img


#include <iostream>
using std::cout;
using std::endl;
using std::cin;

int partition(int abc, int max)//max表示划分的正整数中最大的正整数
{
    if(abc==1 || max==1)
    {
        return 1;
    }
    if(abc<max)
        return partition(abc, abc);
    if(abc==max)
        return partition(abc, abc-1)+1;
    if(abc>max)
        return partition(abc, max-1)+partition(abc-max, max);//由两部分组成:一部分由max-1表示;另一部分由max表示,可转化成abc-max的表示种类
}

int main()
{
    int abc;
    while(cin>>abc)
        cout<<partition(abc,abc)<<endl;
}
————————————————
版权声明:本文为CSDN博主「liuxialong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuxialong/article/details/6580319