【题目描述】
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1 7=1+1+1+1+1+2 7=1+1+1+1+3 7=1+1+1+2+2 7=1+1+1+4 7=1+1+2+3 7=1+1+5 7=1+2+2+2 7=1+2+4 7=1+3+3 7=1+6 7=2+2+3 7=2+5 7=3+4 total=14
【输入】
输入n。
【输出】
按字典序输出具体的方案。
【输入样例】
7
【输出样例】
7=1+1+1+1+1+1+1 7=1+1+1+1+1+2 7=1+1+1+1+3 7=1+1+1+2+2 7=1+1+1+4 7=1+1+2+3 7=1+1+5 7=1+2+2+2 7=1+2+4 7=1+3+3 7=1+6 7=2+2+3 7=2+5 7=3+4
这个的区别是少了访问过的值不能再访问这个条件,所以有些值可以重复访问
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10001];
int sum=0;
void print(int step)
{
sum++;
cout<<n<<"=";
for(int i=1;i<step;i++)
cout<<a[i]<<"+";
cout<<a[step]<<endl;
}
void searchh(int s,int step)
{
for(int i=a[step-1];i<=s;i++)//当前数i要大于等于前1位数,且不超过n
{
if(i<n)
{
a[step]=i;
s-=i;
if(s==0) print(step);
else searchh(s,step+1);
s+=i;
}
}
}
int main()
{
for(int i=0;i<=10000;i++)
a[i]=1;
cin>>n;
searchh(n,1);
return 0;
}
本文介绍了一种递归算法,用于求解任意大于1的自然数的所有可能拆分方式,并通过示例展示了如何将一个特定的自然数(如7)拆分成若干个小于它的自然数之和的方法。
326





