将正整数n划分成连续的正整数之和

如15可以划分成4种连续整数相加的形式:
15
7 8
4 5 6
1 2 3 4 5

分析:

    设n为被划分的正整数,x为划分后最小的整数。

  如果n有一种划分,那么结果就是x,如果有两种划分,就是[x] 和[x ,x + 1];

  如果有m种划分,就是[ x] 、[x ,x + 1] 、 [x, x + 1, x + 2] 、... 、[x, x + 1, x + 2  ...  x + m - 1];
   将每一个结果相加得到一个公式(i * x + i * (i - 1) / 2) = n,i为当前划分后相加的正整数个数。满足条件的划分就是使x为正整数的所有情况。
  如上例,当i = 1时,即划分成一个正整数时,x = 15, 当i = 2时, x = 7。
  当x = 3时,x = 4, 当x = 4时,9/4,不是正整数,因此,15不可能划分成4个正整数相加。
  当x = 5时,x = 1。

  注:i * (i + 1) / 2 <= n(因为连续整数最多的情况是x从1开始)

综上

void split(int n) {
    int i, j, te, x, xlen;
    for (i = 1, xlen = 0; (te = i * (i - 1) / 2) < n; i++) {
        x = n - te;
        if (x % i == 0) {
            x /= i;
            printf("%d", x);
            for (j = 1; j < i; j++) {
                printf("%d ", x + j);
            }
            printf("\n");
            xlen++;
        }
    }
    printf("%d\n", xlen);
}