题目:比如说15=1+2+3+4+5,15=4+5+6,15=7+8都是连续数字的和
求100内所有的此数(能满足连续数的和),并输出有几种可能。
比如说15满足此要求,并有15=1+2+3+4+5,15=4+5+6,15=7+8三种可能!

解决方案 »

  1.   

    切分为
    两个连续数之和
    三个连续数之和

    十三个连续数之和【1-12 最大91】相加的话,从1开始
    两个数 1+2  2+3 3+4 ....
    三个数 1+2+3 2+3+4.....
    和必须小于100,否则结束用一个Map统计每个数的方案数
      

  2.   

    时间有些紧我也没怎么细看,你看结果对不,不对的话我在改改。
    import java.util.*;
    public class CsdnDemo { /**
     * @param args
     */
    public static void main(String[] args) {
    int sum ;
    int j;
    int n=1;
    List<Integer> list = new ArrayList<Integer>();
    for(int i=1;i<45;i++){
    sum= 0;
    j=i;
    n=1;
    while(sum<100){
    sum = sum+j;
    j++;
    n++;
    if(n>2 && sum <100){
    list.add(sum);
    }
    }

    }
    Iterator<Integer> it = list.iterator();
    int f=0;
    while(it.hasNext()){
    f++;
    int s = it.next();
    System.out.print(s +" ,");
    //System.out.println(f);
    }
    System.out.println("\n一共的方法有");
    System.out.println(f);


    }}
      

  3.   


    public class Split { /**
     * @param args
     */
    public void output(int n, int i) {
    int start;
    if (i % 2 == 0) {
    start = n / i - i / 2 + 1;
    for (int j = 0; j < i; j++) { System.out.print(start + j + " ");
    }
    System.out.println("");
    } else {
    start = n / i - i / 2 + 1 / 2;
    for (int j = 0; j < i; j++) { System.out.print(start + j + " ");
    }
    System.out.println("");
    }
    }
    /*
     * 分割的算法包含在这里面
     */
    public void split(int n) {
    int value=0;
    for (int i = 2; i < n; i++) {
    /*
     * n代表要分割的数字,i是分割的i个连续数之和
     * 他们要满足下面的条件就代表n能分割
     */
    if (i % 2 == 0) {
    if (n % i == i / 2 && n / i - i / 2 >= 0) {
    output(n, i);
    value++;
    }
    } else {
    if (n % i == 0 && n / i - i / 2 + 1 / 2 > 0) {
    output(n, i);
    value++;
    }
    }
    }
    if(value>0)
    System.out.println(n+"可分隔次数:"+value);
    } public static void main(String[] args) {
    // TODO Auto-generated method stub Split s = new Split();
    for(int i=1;i<=100;i++){
    s.split(i);
    }
    }}代码逻辑比较简单,就是那个算法 有点复杂。
      

  4.   

    4楼的代码我看了下和我第一次想法一样,你for循环里用的while控制的,我还没想到,我用的双层for循环,使得控制变得复杂。可是你少了题目的要求比如说15有哪三种可能,现在在上课,我回去的时候在考虑下
      

  5.   

    五楼编写的算法确实挺厉害,可就是不明白if (n % i == i / 2 && n / i - i / 2 >= 0) n / i - i / 2 >= 0这个条件我觉得加不加都一样的,下面的一个也是,能否跟我说说你想这题算法的思路,逻辑思路也说下,关键是下次做这种题目时不知道如何下手!谢谢指教了!
      

  6.   


    n % i == i / 2 && n / i - i / 2 >= 0这句就是算法的关键 不加那就死菜菜了n可能被分隔成奇数个或者偶数个连续的数的和当它可分割成奇数个时就必须满足n % i == 0 && n / i - i / 2 + 1 / 2 > 0这个是数学的事。看出的规律。。你自己拿几个数拆下 找到规律 就可以写代码了算法题不是急着写,先分析。分析好了,算法的效率会高很多的。
      

  7.   

    连续求和公式为
    (e+s)*(e-s+1)/2=Sum
    s为开始的数,e为结束的数,Sum为结果Sum现在已知
    再用一个循环从1开始到Sum/2,给s赋值,s也为已知
    再用一元二次方程求实根,如果结果刚好是正整数即求得解,从s到e的连续数相加得sum
      

  8.   

    好像只有2的次方不符合条件。    public static void main(String[] args) throws Exception {
            List[] arr = new List[100];
            for (int i = 2; i <= arr.length; i++) {
                int x = (1 + i) * i / 2;
                int k = 0;
                while (x <= arr.length) {
                    if (arr[x - 1] == null) {
                        arr[x - 1] = new LinkedList();
                    }
                    arr[x - 1].add(0, new int[]{1 + k, i + k});
                    x += i;
                    k++;
                }
            }
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] != null) {
                    System.out.format("%3d : ", i + 1);
                    for (int[] t : (List<int[]>) arr[i]) {
                        System.out.format("%2d+...+%2d  ", t[0], t[1]);
                    }
                    System.out.println();
                }
            }
        }
      

  9.   

    这个有个简单一点的方法其中原理就是:(m+1)+(m+2)+...n=(1+2+3...n)-(1+2+...m)
      

  10.   

    public class Test {    static int a = 1;    /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            for (int i = 1; i <= 100; i++) {
                myMethod(i);
                a = 1;
                System.out.print('\n');
            }    }    public static void myMethod(int input) {
            int sum = 0;
            int c = a;//c为相加的第一个数
            int b = 0;//用于控制相加的次数
            for (int i = a; a < input; i++) {
                sum = sum + i;
                b++;
                if (sum == input) {
                    System.out.print(input + "=");
                    for (int j = 1; j < b; j++) {
                        System.out.print(c + "+");
                        c++;
                        if (j == b - 1) {
                            System.out.print(c + "  ");
                            a++;
                            myMethod(input);
                        }
                    }
                } else if (sum > input) {
                    a++;
                    myMethod(input);
                }
            }
        }
    }