Sicily. 整数划分

Description

对于一个整数m,m > 0,它可以写成t个整数的和的形式(t>0):

m = z1 + z2 + … + zt ,其中zi > 0且为整数(1≤i≤t)

这t个整数就是整数m的一种划分。

比如整数4有以下5种划分:

4

3+1

2+2

2+1+1

1+1+1+1


Input

第一行是一个整数n,代表有n个测试用例

接下来的n行每一行是一个整数m,代表待划分的整数


Output

 对于每一个用例,输出它的所有划分,格式如下:

对于一个划分,它按照数字降序排序,比如:4+3+2+1

对于两个划分3+2和3+1+1的排序:3+2排在3+1+1前面,比较顺序从左到右依次比较,第一个数字3是相等的,接下来第二个数字2 > 1,所以3+2排在3+1+1前面

注意输出没有空格



Sample Input
1
5

Sample Output
5
4+1
3+2
3+1+1
2+2+1
2+1+1+1
1+1+1+1+1

--------------------------------------------------------------------------------------------------------------

经典题!

明眼人都知道要用递归,但是不太好想怎么递归。参考这位大神
#include<stdio.h>
#pragma warning(disable:4996)

int list[255];

void split(int n, int m){
	// 如果分割完毕
	if (n == 0){
		// 遍历输出数组
		for (int i = 0; i < m - 1; i++){
			printf("%d+", list[i]);
		}
		printf("%d\n", list[m-1]);

		return;
	}

	// 由大到小进行分割
	for (int i = n; i >= 1; i--){
		// 如果未分割或当前分割的数字不大于上一个分割的数字
		if (m == 0 || i <= list[m - 1]){
			// 将分割的数字存入数组
			list[m] = i;
			// 分割剩下的数字
			split(n - i, m + 1);
		}
	}
}

int main() {
	int T, n;
	scanf("%d", &T);

	while (T--) {
		scanf("%d", &n);
		split(n, 0);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值