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;
}