P2404 自然数的拆分问题

题目描述

任何一个大于 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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值