比如整数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);
}
背后的逻辑看代码不容易看懂,可以看连接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里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
#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