版权声明:代码属于原创,转载请联系作者并注明出处。 https://blog.csdn.net/weixin_43379056/article/details/85003190
1077. 自然数的拆分问题
题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。拆分成的数字相同但顺序不同被看做是相同的方案,如果1+3与3+1被看做是同一种方案。
输入
输入待拆分的自然数n。
输出
如样例输出若干个拆分方案(具体见样例)。
样例输入
7
样例输出
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4
数据范围限制
1<=n<=20
C++代码
#include <iostream>
#include <cstring> // memset()
#include <cassert> // assert()
using namespace std;
const int max_size = 1000; // suppose maximum split numbers in solution
const int max_n = 20; // maximum value of n
int splitNumbers[max_size]; // store split numbers in solution
void NumberSplitting(int sum,int num);
void printSolution(int x);
int main()
{
int n;
cin >> n;
assert(n>=1 && n<=max_n);
memset(splitNumbers, 0, sizeof(splitNumbers));
// use recursive method to find all number splitting solutions
NumberSplitting(n, 1);
return 0;
}
void printSolution(int x)
{
for(int i=1; i<x-1; i++)
{
cout << splitNumbers[i] << "+";
}
cout << splitNumbers[x-1] << endl;
}
void NumberSplitting(int sum,int num)
{
if(sum==0 && num>2)
{
// print split numbers in solution
printSolution(num);
return ;
}
for(int i=1; i<=sum; i++)
{
if(i >= splitNumbers[num-1]) // ensure sequence
{
splitNumbers[num] = i;
NumberSplitting(sum-i, num+1);
}
}
}