输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正 整数序列。例如6=1+2+3  5=2+3

解决方案 »

  1.   


    public class Answer
    {
        static void printResult(int x,int start,int n)
        {
            System.out.print(x + " = " + start++);
            for(int i=1;i<n;i++)
                System.out.print(" + " + start++);
            System.out.println();
            
        }
        static void guest(int x)
        {
            for(int sum=3,n=2;sum<=x;sum+=++n)
            {
                if((x-sum)%n==0)
                    printResult(x,(x-sum)/n+1,n);
            }
        }
        public static void main(String[] args)
        {
            guest(5);
            guest(6);
            guest(66);
            guest(105);
        }}5 = 2 + 3
    6 = 1 + 2 + 3
    66 = 21 + 22 + 23
    66 = 15 + 16 + 17 + 18
    66 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11
    105 = 52 + 53
    105 = 34 + 35 + 36
    105 = 19 + 20 + 21 + 22 + 23
    105 = 15 + 16 + 17 + 18 + 19 + 20
    105 = 12 + 13 + 14 + 15 + 16 + 17 + 18
    105 = 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15
    105 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14
      

  2.   

    public class Test {
    public static void main(String[] args) {
    guest(105);
    } public static void guest(int number) {
    StringBuffer strb = new StringBuffer();
    int count = 1;
    int sum = 1;
    while (true) {
    if (((number - sum) % ++count) == 0) {
    int min = (number - sum) / count;
    strb.append(number + " = " + min);
    for (int i = 1; i < count; i++) {
    strb.append(" + " + (min + i));
    }
    strb.append("\r\n");
    }
    sum = sum + count;
    if ((number - sum) < count)
    break;
    }
    System.out.println(strb.toString());
    }
    }
      

  3.   

    public static void Result(int N){
    for(int i = 2 ; i <= N / 2 ; i++){
    for( int k = 0 ;  ; k++){
    int sum = i * k + (i + 1) * i / 2 ;
    if(N == sum){
     System.out.print(N + " = " + (++k));
    for(int j = 1 ; j < i ; j++){
    System.out.print("+" + (++k));
    }
    System.out.println();
    break ;
    }
    if( sum > N){
    break ;
    }
    }
    }
    }
      

  4.   


    package com.isw2.test;public class Test {
    public static void disValue(int begin, int size, int value) {
    System.out.print(value + " = " + begin++);
    for (int count = 1; count < size; count++, begin++) {
    System.out.print(" + " + begin);
    }
    System.out.println();
    } public static void findValue(int value) {
    //value = (begin + end)*size / 2
    for (int size = 2; size < value; size++) {
    int tempValue = 2 * value;
    if (0 == tempValue % size) {
    if (0 == (tempValue / size + 1 - size) % 2) {
    int begin = (tempValue / size + 1 - size) / 2;
    disValue(begin, size, value);
    }
    }
    }
    } public static void main(String[] args) {
    findValue(105);
    }
    }
    105 = -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15
    105 = -11 + -10 + -9 + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18
    105 = -14 + -13 + -12 + -11 + -10 + -9 + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20
    105 = -18 + -17 + -16 + -15 + -14 + -13 + -12 + -11 + -10 + -9 + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23
    105 = -33 + -32 + -31 + -30 + -29 + -28 + -27 + -26 + -25 + -24 + -23 + -22 + -21 + -20 + -19 + -18 + -17 + -16 + -15 + -14 + -13 + -12 + -11 + -10 + -9 + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36
      

  5.   

    1楼的算法非常好啊。
    原理如下:假设x可以表示为n个连续的自然数之和,这n个自然从s(start)开始,为:s,s+1,...s+n-1,由等差数列求和公式:(s+s+n-1)*n/2=x==>2*n*s+(n-1)*n=2*x==>2*n*s=2*x-(n-1)*n            (n-1)n 
    ==>n*s=x -  ------
                  2
    这时(n-1)*n/2就是1+2+...(n-1),把它记为sum(1..n-1),则:       x-sum(1..n-1)
    ==>s=--------------   .......(公式1)
               n所以只要能保证分式能整除,就可以得到一个s,也就能得到一个结果.
    楼主用的,在上面的公式上稍要变换:         x-sum(1..n-1)
    ==>s-1=-------------  - 1
                 n
           x-sum(1..n-1)-n    x-sum(1..n)
    ==>s-1=--------------- = -----------
               n                  n
          x-sum(1..n)
    ==>s=------------  + 1  ........(公式2)
              n如果用公式2编程,就是1楼的代码,如果用公式1编程,可以:    static void guest(int x){
        
            for(int sum=1,n=2;sum<x;sum+=n++){
            
                if((x-sum)%n==0)
                    printResult(x,(x-sum)/n,n);
            }
        }
    还可以用前面推导过程中的中间式编程,但比起用公式1和公式2的代码来,效率差些。
      

  6.   

      public static void guest(int number) {
            StringBuffer strb = new StringBuffer();
            int count = 1;
            int sum = 1;
            while (true) {
                //如果满足下面所说思路的条件,说明有相加的形式
                if (((number - sum) % ++count) == 0) {
                    //找到相连数中最小的数
                    int min = (number - sum) / count;
                    strb.append(number + " = " + min);
                    //count 表示有多少个数要相加
                    for (int i = 1; i < count; i++) {
                        strb.append(" + " + (min + i));
                    }
                    strb.append("\r\n");
                }
                //在循环中要减去的:就是下面说的4*4+1+2+3 中的1+2+3
                sum = sum + count;
                //如果相减的结果比数的个数要小就跳出while循环
                if ((number - sum) < count)
                    break;
            }
            System.out.println(strb.toString());
        }
    思路是这样的:x-1%2 如果为0那么它一定符合要求 2为有几个相连的数 如: 3+4=7 ,那么7-1/2 为3就是
    相连数的最小一个。  所有我只要求出最小的数就行了。4+5+6+7=4*4+1+2+3 ,只要(x-1-2-3)/4 就是最小的那个数。
      

  7.   

    看了半天,有一个地方还是不太明白,就是sum为什么要从3开始呢
      

  8.   

    我也来一个
    public static void go(int sum) {
    LinkedList<Integer> list = new LinkedList<Integer>();
    int t = 0;
    for (int i = 1; i < sum; i++) {
    if (t == sum) {
    System.out.println(list);
    }
    t += i;
    list.addLast(i);
    while (t > sum) {
    t -= list.getFirst();
    list.removeFirst();
    }
    }
    } public static void main(String[] args) {
    go(66);
    go(105);
    }
      

  9.   

    设某个整数temp,它的序列第一个数为j,序列长度为i,则有j + (j+1) + ....+(j+i-1)= i*j + (i -1)*i/2 = temp。根据该等式,设置循环可得所有可能
    public class SumArray {
    public static void main(String[] args) {
    for(int a = 0 ; a < args.length ; a++){  //获得所有输入的数
    int temp = Integer.parseInt(args[a]);
    for(int j = 1 ; j < temp; j++){  //j为序列中第一个数,如5=2+3中,j对应2
    for(int i = 1 ; i < temp;i++){
    if((i*j + (i-1)*i/2)==temp){ //i为序列的长度
    int b = j;  
    System.out.print(temp + " = ");
    while(i-- > 0){
    System.out.print(b++ + "  ");
    }
    System.out.println();
    break;
    }
    }
    }
    }
    }
    }main(String[] args)的args为“5 6 66 105”,则结果为:
    5 = 2  3  
    6 = 1  2  3  
    66 = 1  2  3  4  5  6  7  8  9  10  11  
    66 = 15  16  17  18  
    66 = 21  22  23  
    105 = 1  2  3  4  5  6  7  8  9  10  11  12  13  14  
    105 = 6  7  8  9  10  11  12  13  14  15  
    105 = 12  13  14  15  16  17  18  
    105 = 15  16  17  18  19  20  
    105 = 19  20  21  22  23  
    105 = 34  35  36  
    105 = 52  53