乾龙亢有悔,坤马利坚贞。

转发申明:原版的书文转自http://www.cnblogs.com/xiezie/p/5511707.html

坎坎信行尚,离离中色身。

前些天上午,有个对象找到本人,他在用matlab编程,可是蒙受一个标题,化解不了。

震行笑言哑,艮止善心纯。

标题如下:

巽顺万民族音乐,兑泽全世界春。

输入n个数组,数老董度不等,从各类数组抽出二个数实行整合,求出全数的构成。

例子:

int a[]={1,2};

int b[]={3,4,5};

只怕的咬合:{1,3};{1,4};{1,5};{2,3};{2,4};{2,5};

 

搞了40分钟左右,不辱任务~

JAVA代码落实:

 

import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(new BufferedInputStream(System.in));
     //这里使用ArrayList<ArrayList<Integer>>是为了方便int数组的操作
        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();//若已知所以组合的具体个数可以定义容量长度--》提高性能
        System.out.println("输入要所有数组的总个数:");
        int n = scanner.nextInt();//数组的个数
        int[] allLen = new int[n];//所有数组的长度

        int index = 0;
        int ll = n ;
        while(ll--!=0){
            System.out.println("输入第" + (index + 1)
                    + "个数组的长度:");
            int m = scanner.nextInt();//输入一个数组的长度
            allLen[index++] = m;
            ArrayList<Integer> arrayList = new ArrayList<>(m);
            System.out.println("输入第" + index + "个数组的数据:" + "个数为\t" + m);
            for(int i = 0 ; i != m ; i ++ ){
                arrayList.add(scanner.nextInt());
            }
            lists.add(arrayList);
        }

        int[] allLenProduct = new int[n];//数组的长度乘积增量
        int p = 1; //组合的个数
        int l = n;
        int index1 = 0;

        ArrayList<ArrayList<Integer>> results = new ArrayList<>(p);
        while(--l!=-1){
            allLenProduct[index1] = p;
            p=allLen[index1++]*p;
        }
        for(int i = 0 ; i != p ; i ++ ){
            ArrayList<Integer> arrayList = new ArrayList<>(n);
            for(int j = 0 ; j != n ; j ++){
                arrayList.add(lists.get(j).get(i/allLenProduct[j]%allLen[j]));
            }
            results.add(arrayList);
        }

        int len = results.size();
        System.out.println("所有的组合:");
        for(int i = 0 ; i != len ; i ++ ){
            ArrayList<Integer> arrayList = results.get(i);
            int aLen = arrayList.size();
            System.out.print("\t第\t" + (i + 1) + "\t行:\t");
            for(int j = 0 ; j != aLen ; j ++){
                System.out.print(arrayList.get(j) + " ");
            }
            System.out.println();
        }
        scanner.close();
    }

}

 

测试:

输入:

输入要全数数组的总个数:
4
输入第1个数组的长度:
2
输入第1个数组的数额:个数为
2
1 2
输入第2个数组的长短:
3
输入第2个数组的数量:个数为
3
4 5 6
输入第3个数组的尺寸:
3
输入第3个数组的多寡:个数为
3
7 8 9
输入第4个数组的长短:
4
输入第4个数组的数码:个数为
4
10 11 12 13

 

结果:

富有的整合:
第 1 行: 1 4 7 10
第 2 行: 2 4 7 10
第 3 行: 1 5 7 10
第 4 行: 2 5 7 10
第 5 行: 1 6 7 10
第 6 行: 2 6 7 10
第 7 行: 1 4 8 10
第 8 行: 2 4 8 10
第 9 行: 1 5 8 10
第 10 行: 2 5 8 10
第 11 行: 1 6 8 10
第 12 行: 2 6 8 10
第 13 行: 1 4 9 10
第 14 行: 2 4 9 10
第 15 行: 1 5 9 10
第 16 行: 2 5 9 10
第 17 行: 1 6 9 10
第 18 行: 2 6 9 10
第 19 行: 1 4 7 11
第 20 行: 2 4 7 11
第 21 行: 1 5 7 11
第 22 行: 2 5 7 11
第 23 行: 1 6 7 11
第 24 行: 2 6 7 11
第 25 行: 1 4 8 11
第 26 行: 2 4 8 11
第 27 行: 1 5 8 11
第 28 行: 2 5 8 11
第 29 行: 1 6 8 11
第 30 行: 2 6 8 11
第 31 行: 1 4 9 11
第 32 行: 2 4 9 11
第 33 行: 1 5 9 11
第 34 行: 2 5 9 11
第 35 行: 1 6 9 11
第 36 行: 2 6 9 11
第 37 行: 1 4 7 12
第 38 行: 2 4 7 12
第 39 行: 1 5 7 12
第 40 行: 2 5 7 12
第 41 行: 1 6 7 12
第 42 行: 2 6 7 12
第 43 行: 1 4 8 12
第 44 行: 2 4 8 12
第 45 行: 1 5 8 12
第 46 行: 2 5 8 12
第 47 行: 1 6 8 12
第 48 行: 2 6 8 12
第 49 行: 1 4 9 12
第 50 行: 2 4 9 12
第 51 行: 1 5 9 12
第 52 行: 2 5 9 12
第 53 行: 1 6 9 12
第 54 行: 2 6 9 12
第 55 行: 1 4 7 13
第 56 行: 2 4 7 13
第 57 行: 1 5 7 13
第 58 行: 2 5 7 13
第 59 行: 1 6 7 13
第 60 行: 2 6 7 13
第 61 行: 1 4 8 13
第 62 行: 2 4 8 13
第 63 行: 1 5 8 13
第 64 行: 2 5 8 13
第 65 行: 1 6 8 13
第 66 行: 2 6 8 13
第 67 行: 1 4 9 13
第 68 行: 2 4 9 13
第 69 行: 1 5 9 13
第 70 行: 2 5 9 13
第 71 行: 1 6 9 13
第 72 行: 2 6 9 13

相关文章