JS数组5个选3个,5个选2个怎么写

var arr1 = [3,5,9,6,11];
1.从数组 arr1 里取其中三个值组合成一个新数组如下:
arr2 = [
[3,5,9,x1,x2],
//x1:为1-11之间的数( 但不能包含前面的三个数值 3,5,9 );
//x2:为1-11之间的数( 但不能包含前面的四个数值 3,5,9,x1 );
[3,5,6,x1,x2]
++其他全部数组....
];
2. arr2里不能包含有arr1 (从小到大排序后在对比)

以上JS 应该怎么写? 完整JS最好 先谢过了
最新回答
战天傲刃

2022-01-28 16:38:50

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

也可以下载附件,直接双击打开。

<div>
    <div style="">组合的结果</div>
    <textarea id="zuhe" style="height:40%"></textarea>
    <div style="">排列的结果</div>
    <textarea id="pailie" style="height:40%"></textarea>
</div>
<script>
zuhe();
pailie();
function pailie(){ 
    //不考虑顺序,组合问题(arr1中的3个数按从左到右顺序,其他按从小到大顺序)
    //从3,5,9,6,11里边取3个,有C(5,3)=5*4*3/(3*2*1)=10中取法;
    //再从剩下的(11-3)=8个数里边取两个,有C(8,2)=8*7/(2*1)=28种取法。
    //共有10*28=280种排列方式,去掉里边[3,5,9,6,11]的排列(C(5,3)*1=10种),所以最终结果为280-10=270
    //也就是说生成的arr2里边有270个元素。
    var arr1 = [3, 5, 9, 6, 11];
    //5选3
    var r3 = [];
    var r5 = [];
    var i, j, k, a, m, n;
    for(i=0;i<3;i++){ 
        for(j=i+1;j<4;j++){ 
            for(k=j+1;k<5;k++){ 
                r3.push([arr1[i], arr1[j], arr1[k]]);
                //获取剩余的8个数
                var r8 = [];
                for (m = 1; m <= 11; m++) {
                    if (m == arr1[i] || m == arr1[j] || m == arr1[k]) continue;
                    r8.push(m);
                }
                //8选2
                for (m = 0; m < 7; m++) {
                    for (n = m + 1; n < 8; n++) {
                        if (arr1.indexOf(r8[m]) == -1 || arr1.indexOf(r8[n]) == -1) {
                            //筛掉两个数都是arr1里边的
                            r5.push([arr1[i], arr1[j], arr1[k], r8[m], r8[n]]);
                        }
                    }
                }
            }
        }
    }
    console.log(r3.length);
    console.log(r5.length);
 
    var tf = document.getElementById("pailie");
    tf.value = r5.join("\n");
}
 
function zuhe() {
    //考虑顺序,排列问题
    //从3,5,9,6,11里边取3个,有A(5,3)=5*4*3=60中取法;
    //再从剩下的(11-3)=8个数里边取两个,有A(8,2)=8*7=56种取法。
    //共有60*56=3360种排列方式,去掉里边[3,5,9,6,11]的排列(共有A(5,5)=5*4*3*2*1=120种),所以最终结果为3360-120=3240种
    //也就是说生成的arr2里边有3240个元素。
    var arr1 = [3, 5, 9, 6, 11];
    //5选3
    var r3 = [];
    var r5 = [];
    var i, j, k, a, m, n;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            if (j == i) continue;
            for (k = 0; k < 5; k++) {
                if (k == i || k == j) continue;
                r3.push([arr1[i], arr1[j], arr1[k]]);
                //获取剩余的8个数
                var r8 = [];
                for (m = 1; m <= 11; m++) {
                    if (m == arr1[i] || m == arr1[j] || m == arr1[k]) continue;
                    r8.push(m);
                }
                //8选2
                for (m = 0; m < 7; m++) {
                    for (n = m + 1; n < 8; n++) {
                        if (arr1.indexOf(r8[m]) == -1 || arr1.indexOf(r8[n]) == -1) {
                            //筛掉两个数都是arr1里边的
                            r5.push([arr1[i], arr1[j], arr1[k], r8[m], r8[n]]);
                            r5.push([arr1[i], arr1[j], arr1[k], r8[n], r8[m]]);
                        }
                    }
                }
            }
        }
    }
 
    console.log(r3.length);
    console.log(r5.length);
 
    var tf = document.getElementById("zuhe");
    tf.value = r5.join("\n");
}
 
 
</script>