鍍金池/ 問答/HTML/ 從五個數(shù)任意選3個數(shù)為一個組合,最多能有幾個組合哦

從五個數(shù)任意選3個數(shù)為一個組合,最多能有幾個組合哦

Image

從五個不重復(fù)的數(shù)(0-9) 選取3個為一個組合 順序了不同 最多能有多少組合?
js來寫 如果可以的話 能不用es6就不用(還不會)
ps: 我來做的話也就想到三重循環(huán)那種笨方法
要是能有簡潔的寫法就好了
在擴展一下如果也適合6個數(shù)選取4個數(shù)為一組合的就好了...
你們不要在數(shù)學(xué)算了(數(shù)學(xué)差也不會算) 我發(fā)這個問題是想用js輸出這些可以組合的數(shù)字 而不是再求數(shù)學(xué)題
回答
編輯回答
情殺

1.你這是數(shù)學(xué)問題,不是程序問題
2.你說順序不限,那就是可以重復(fù),任意5個數(shù)里選三個數(shù),那就是5x5x5=125種組合
3.推而廣之,n個數(shù)里選m個數(shù),那就是n的m次方Math.pow(n,m)

2017年4月4日 22:01
編輯回答
淡墨

C35 * C510

2018年5月21日 10:45
編輯回答
無標(biāo)題

第1個可能,只有5個不重復(fù)的數(shù),5個數(shù)中取3個組合,是C(5,3)=P(5,3)/(3!)=C(5,2)=P(5,2)/(2!)=5!/((5-2)!)/2!=10

第2個可能,其實是有10個不重復(fù)的數(shù),分成兩步,先選5個不重復(fù)的數(shù),再在這5個數(shù)中選3個來組合,最后的組合有多少種,其實這個問題就是在10個不同數(shù)中選3個來組合,即C(10,3)=P(10,3)/(3!)=10!/((10-3)!)/3!= 10!/(7! * 3?。?= 120


上面是以往的回答,下面是對其實質(zhì)問題的回答


的javascript實現(xiàn)

// 對N個元素取M組合的序數(shù)排列可能全輸出函數(shù)
// 其返回一個二維數(shù)組,數(shù)組長度是可能的數(shù)量,每個子數(shù)組有M個元素,每個元素值代表其取原始數(shù)組的序號。
function mcom(n,m){
                var rt=[];
                for (var i=0;i<Math.pow(2,n);i++){
                    var a=0;
                    var tmp=[];
                    for (var j=0;j<n;j++){
                        if(i>>j & 1){
                            a++;
                            tmp.push(j);
                        }
                    }
                    if(a==m){
                        rt.push(tmp);
                    }
                }
                return rt;
            }

上面的代碼利用了位運算,其原理其實很簡單,它產(chǎn)生一個N個元素的所有可能組合(對應(yīng)于0至 111...111 的二進制數(shù),其中后面一個有N個1),然后過濾出恰好有M個1的數(shù),就是所要求的,所以這個效率其實不高的,特別是對于N很大時。


鑒于題主不理解上面實現(xiàn)的原理,我再詳細解釋一下。
對于N個不重復(fù)元素,其取得0個到N個元素組合的可能C(N,M) (0<=M<=N)如果用二進制表示,就是,用A(N)表示所有N位二進制數(shù),包括N個0的,即范圍為[0,Power(2,N)-1]的非負整數(shù)集合,可以知道對于任何組合可能其實對應(yīng)于一個A(N)內(nèi)的整數(shù),記這個數(shù)C(N,M) 其還滿足以下對應(yīng)條件:
M=0 --- C(N,0) 所有位均為0,即沒有為1的位
M=1 --- C(N,1) 有且僅有1位為1
M=2 --- C(N,2) 有且僅有2位位1
...
M=N ---C(N,N) 所有位都位1


以 樓主 開始要求的在[1,2,3,4,5]中取3個都組合 舉例就是:

    元素                
1   2   3   4   5
 對應(yīng)的二進制數(shù)        對應(yīng)十進制數(shù)    取得的組合
1   1   1   0   0      28            1,2,3
1   1   0   1   0      26            1,2,4      
1   1   0   0   1      25            1,2,5
1   0   1   1   0      22            1,3,4
1   0   1   0   1      21            1,3,5
1   0   0   1   1      19            1,4,5
0   1   1   1   0      14            2,3,4
0   1   1   0   1      13            2,3,5
0   1   0   1   1      11            2,4,5
0   0   1   1   1      7             3,4,5

可見,只要通過位運算來過濾出[0,Power(2,N)-1]的非負整數(shù)集合中滿足只有M位為1的數(shù)就可以找到對應(yīng)的組合。這就是前面算法的實現(xiàn)原理。

其中過濾操作是通過位運算 X&1實現(xiàn),具體過濾對應(yīng)于:

                    for (var j=0;j<n;j++){
                        if(i>>j & 1){
                            a++;
                            tmp.push(j);
                        }
                    }
                    if(a==m){
                        rt.push(tmp);
                    }

,還是繼續(xù)上面的例子,以4,7、15分別為例,這里n=5了,m=3,

4的二進制為100,這時i=4所以有
j=0, 4>>0=4  4 & 1 =0 
j=1, 4>>1=2  2 & 1 =0
j=2, 4>>2=1  1 & 1 =1,  a=1, tmp=[2]
直到循環(huán)結(jié)束 a=1,tmp=[2],  因為a<m,所以rt不增加tmp這個可能

7的二進制為111,這時i=7所以有
j=0, 7>>0=7  7 & 1 =1,  a=1, tmp=[0] 
j=1, 7>>1=3  3 & 1 =1,  a=2, tmp=[0,1]
j=2, 7>>2=1  1 & 1 =1,  a=3, tmp=[0,1,2]
直到循環(huán)結(jié)束 a=3,tmp=[0,1,2],  因為a=m,所以rt增加tmp這個可能

15的二進制為1111,這時i=15所以有
j=0, 15>>0=15  15 & 1 =1,  a=1, tmp=[0] 
j=1, 15>>1=7   7 & 1 =1,  a=2, tmp=[0,1]
j=2, 15>>2=3   3 & 1 =1,  a=3, tmp=[0,1,2]
j=3, 15>>3=1   1 & 1 =1,  a=4, tmp=[0,1,2,3]
直到循環(huán)結(jié)束 a=4,tmp=[0,1,2,3],  因為a>m,所以rt不增加tmp這個可能
2017年11月1日 10:09