jzxx2026自然数拆分

题目描述
自然数的拆分:任何一个大于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;
}

猜你喜欢

转载自blog.csdn.net/lyz060510/article/details/85394153