sicily1000. 整数划分

来源:互联网 发布:淘宝手机500元优惠券 编辑:程序博客网 时间:2024/05/01 06:09

sicily1000. 整数划分

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
Copy sample input to clipboard
1
5
Sample Output
5
4+1
3+2
3+1+1
2+2+1
2+1+1+1
1+1+1+1+1

解题思路:
1、将m看成m个1,其最多划分成m个部分
2、把m划成0个部分,输出m。
把m划分第1个部分, m-1, 1
m-2, 2
m-3, 3
1, m-1
当第一部分小于第二部分, 不进行输出, 继续划分。
当最后部分划分为1,结束划分。
把m划分第2个部分, m-2, 1,1
m-3, 2,1
m-3, 1,2
m-4, 3,1
m-4, 2,2
m-4, 1,3
….
…..
1,1, m-2
当第i(i>=1)部分小于i-1部分, 不进行输出, 继续划分。
当划分第i(i>=2)部分, 划分时需判断是否小于前一部分,
是,继续划分。
否,结束划分。

#include <cstdio>#include <cctype>#include <cstdio>int list[100001];void divide(int n, int m) {    if (m == 0 || list[m] <= list[m-1]) {        for (int i = 0; i <= m; i++) {            if (i == 0)                printf("%d", list[0]);            else                printf("+%d", list[i]);        }        printf("\n");    }    for (int i = n-1; i >= 1; i--) {        list[m] = i;        list[m+1] = n-i;        if (m == 0 || list[m] <= list[m-1]) {                divide(n-i, m+1);        }    }}int main() {    int n, m;    scanf("%d", &n);    for (int i = 0; i < n; i++) {        scanf("%d", &m);        list[0] = m;        divide(m, 0);    }    return 0;}                                 
0 0
原创粉丝点击