题目描述
任何一个大于 11 的自然数 �n,总可以拆分成若干个小于 �n 的自然数之和。现在给你一个自然数 �n,要求你求出 �n 的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。
输入格式
输入:待拆分的自然数 �n。
输出格式
输出:若干数的加法式子。
输入输出样例
输入 #1复制
7
输出 #1复制
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
说明/提示
数据保证,2≤�≤82≤n≤8。
题解:
观察示例前面的数字不会超过它后面的数字,建立一个全是一的数组从开始累加超过n在上次成功的式子做修改,把式子累加的数据倒数第二个加1,后面的数字和倒数第二个一样,累加不够就把最后的加一。当上次成功的式子直邮两个数字并且第一个已经等于n/2的最大值就代表式子没有了。
代码:
#include<stdio.h>
int a[10]={4},n;
char book[10]={0};
void kk(int step)
{
int m=0,j=1,d,i=1;
while(m<n)
{m+=a[j];j++;
}
if(m==n){
for(d=1;d<j-1;d++)
printf("%d+",a[d]);
printf("%d\n",a[d]);
a[j-2]++;for(;j<n;j++)
a[j-1]=a[j-2];
}
else if(m>n){
if(j==3)return ;
a[j-2]++;
for(;j<n;j++)
a[j-1]=a[j-2];
}
while(i<=n/2){
kk(step+1);
j=0;m=0;
i++;
}
}
main()
{
int i=1;
scanf("%d",&n);
while(i<=n)a[i++]=1;
kk(1);
}