题目描述
自然数的拆分:任何一个大于1的自然数N(N<=10),总可以拆分为若干个自然数之和,并且有多种拆分方法。例如,自然数5,可以有以下一些拆分方法:
5=5
5=4+1 (5=1+4看成同一种拆分)
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
编一个程序要求对输入的自然数N,依次输出它的所有拆分。
输入
一行,一个自然数n(1<n<11)。
输出
若干行,每行一种拆分的方案。为了简化问题,约定n和等号加号不用输出,每个数的场宽为3
样例输入
5
样例输出
5
4 1
3 2
3 1 1
2 2 1
2 1 1 1
1 1 1 1 1
满分代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[15];
void myprint(int n)
{
for(int i=1; i<=n; i++)
{
cout<<setw(3)<<a[i];
}
cout<<endl;
}
void search(int s,int step)
{
for(int i=a[step-1]; i>=1; i--)
{
if(i<=s)
{
a[step]=i;
s=s-a[step];
if(s==0)
{
myprint(step);
}
else
{
search(s,step+1);
}
s=s+a[step];
}
}
}
int main()
{
cin>>n;
a[0]=n;
search(n,1);
return 0;
}