有m个整数,请求出这m个数中任意n(m>n)个数的和的所有情况,不允许有重复的。
比如说有1,2,3,4,5这5个数,就其中任意2个数和的情况:
1+2=3;
1+3=4;
1+4=5;
1+5=6;
2+3=5;
2+4=6;
2+5=7;
2+6=8;
3+4=7;
3+5=8;
4+5=9;
4+6=10;
5+6=11;
最后的结果为
2,3,4,5,6,7,8,9,10,11
补充:不能有重复,m可能很大,1<=n<=m。

解决方案 »

  1.   

    LZ 的问题不严密啊 。
    “不允许有重复的”是说什么?包括指:“选出来的n个数之中不能有重复的” 吗?
    那么你例子中的2就得不出来。
      

  2.   

    这个很象我写的一个数学矩阵计算(当时系主任让我做的)。当时是要求一个矩阵的任意两项和,三项n项和。思路很简单,拿a[]={1,2,3,4}来说,定义一个类Sample(String 表达式,int flat)
    两项和与你那个数组遍列即为三项和,三项和与数组遍列就是四项和啦。。
    下面是两项和:
    1+2=3(flat=1),2的数组下标为1
    1+3 =4(flat=2)
    1+4=5(flat=3)
    2+3=5(flat=2)
    2+4=6(flat=3)
    3+4=7(flat=3)
    flat是这个n项和中数组下标的最大值,用sample存起来 放到list里当我们求三项和:
    List<Sample> three=new ArrayList<Sample>();
    for(Sample s:list)
        for(int i=s.flat+1;i<a.length;i++){
              Sample temp=new Sample();
               temp=s.表达式+i;
               temp.flat=i;      
       }
    这样three中就是三项,以此类推。
    到这就差不多了,自已写过递归求n项和。
      

  3.   

    list存的两项和List <Sample> three=new ArrayList <Sample>(); 
    for(Sample s:list) 
        for(int i=s.flat+1;i <a.length;i++){ 
              Sample temp=new Sample(); 
              temp=s.表达式+i; 
              temp.flat=i;  
              three.add(temp);  
      } 
    这个只是给你点思路,梢加修改应该可以用的,这个东西可以用递归或循环实现。
      

  4.   

    int arr[]=new int[]{2,6,4,5,8,7,10,3,1}; // 任意n個數

    int n = arr.length-1; 
    int result[] = new int[2*n]; // 用於存放結果
    int count = 0;

    for (int i=0; i<=n; i++){
       
       for (int j=i; j<=n; j++){
       if (i==j){ // 不能自己加自己
       continue;
       }else{
       
       int value = arr[i]+arr[j];
       boolean isre = false; //默認為沒有重複值    // 查找是否有重複值
       for(int k=0; k<count; k++){
       if (value==result[k]){
       isre = true; // 如果有重複值則設為true
       }
       }
       
       if (!isre){ // 如果沒有重複值則加入結果數組
       result[count]=value;
       count++;
       }
       
       }
       }
      

  5.   

    off是偏移量,count記數器,數你已算了多少個,src保存你要處理的數組,mem暫存要加和的數,其length即為你的n... private static void abc(int off, int count, int[] src, int[] mem) {
    if (count >= mem.length) {
    int tmp = mem[0];
    System.out.print(mem[0]);
    for (int i = 1 ; i < mem.length ; ++i) {
    tmp += mem[i];
    System.out.print("+" + mem[i]);
    }
    System.out.print("=");
    System.out.println(tmp);
    return;
    }
    if (off >= src.length) return;
    for (int i = off; i < src.length; ++i)
    {
    // if (!(off == 0) && mem[off] == mem[off - 1]) continue;
    mem[count] = src[i];
    abc(i + 1, count + 1 , src, mem);
    }

    }
      

  6.   

    import java.util.Arrays;
    import java.util.Scanner;public class SumTest{ public static void main(String[] args){

    int[] m = new int[]{1,2,3,4,5,6};
    /*以下代码是运行输入数组
    int mLength;
    Scanner input = new Scanner(System.in);
    System.out.println("请输入初始数组的长度;");
    mLength = input.nextInt();
    int[] m = new int[mLength];
    for(int i=0;i<mLength;i++){
    System.out.println("请输入数组的第;"+i+"个整数:");
    m[i] = input.nextInt();
    }
    */

    int[] n = new int[m.length * m.length];
    int nIndex = 0;   //结果数组的下标 
    boolean zeroFlag = false;  //记录结果中是否有零。
    for(int i=0;i<m.length-1;i++){
    for(int j=i+1;j<m.length;j++){
    int sum = m[i] + m[j];
    Arrays.sort(n);//对结果数组排序
    if(Arrays.binarySearch(n,sum)<0){   //判断数组否包含计算结果,若不包含则放入到结果数组,否则继续循环
    n[nIndex] = sum;
    nIndex++;
    if(sum == 0)
    zeroFlag = true;
    }
    }
    }

    Arrays.sort(n);
    if(zeroFlag == true)
    System.out.println(0 + ","); //若结果数组包含0,首先输出0
    for(int i : n){   //输出其它非0的结果
    if(i != 0)
    System.out.println(i + ",");
    }
    }
    }
      

  7.   

    以上代码是用数组实现,还可以用HasSet来实现,原理相同,只不过要将int打包为Integer即可
      

  8.   


    package math;import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;public class sum {
    private static int[] A;
    private static List L_OUTER;
    private static List L_INNER;
    public static void main(String args[]){
    A=new int[10];
    L_OUTER=new ArrayList();
    Random rand=new Random();
    for(int i=0;i<A.length;i++){
    A[i]=rand.nextInt(100);
    };
    for(int j=0;j<A.length;j++){
    int k=j;
    L_INNER=new ArrayList();
    while(true){
    if(k==A.length-1)break;
    System.out.println("j"+j+"k"+k);
    L_INNER.add(k-j, A[j]+A[k+1]);
    k++;
    };
    L_OUTER.add(L_INNER);
    L_INNER=null;
    };
    System.out.println(L_OUTER.size());
    for(int m=0;m<A.length;m++){
    List l_inner=new ArrayList();
    l_inner=(List)L_OUTER.get(m);
    for(int n=0;n<l_inner.size();n++){
    System.out.println("m="+m+" l_inner="+l_inner.size()+"   value="+l_inner.get(n));
    };}
    }}
      

  9.   

    你的想法太简单了,不知是就两个数的和,还有三个的呢 注意1<n<m
      

  10.   

    你也可以把一些数字弄成一个数组集合int b[];初始化或者说设定好你需要的数字之后。如果你设定的初始化 数据有重复的。则先去掉重复1+2+3的 意思可以表达成 位置1的值 +位置2的值 +位置3的值1+2+3=..; 第2个位置的值 始终是顺序 第3个位置的值是起点2的值+1 
    1+2+4=..; 
    1+2+5=..; 
    1+2+6=..; 1+3+4=..; 
    1+3+5=..; 
    1+3+6=..; 1+4+5=..; 
    1+4+5=..; 1+5+6=..; 
    4个数的时候 
    。 
    5个的时候 
    .... 
    以此类推