得出「15選5」的各種組合 組合生成演算法

2022-02-10 06:09:32 字數 2268 閱讀 9812

今天有個網友問我組合數生成演算法的問題,這個寫的早,只給他回覆了原理。剛好這段時間玩「15選5」,知道那個是隨機的,概率問題(中就是中了,沒中就是沒中),沒啥好分析的,可還是忍不住想計算下……

好,不廢話了,下面開工。

一、原理

借助二進位制計數的機制來進行,比如字串「123」中選出兩個字元,如下計算:

1:二進位制串為 0001

2: 0010

3: 0011

4: 0100

5: 0101

6: 0110

7: 0111

8: 1000

其中含有兩個1的有

3: 0011

5: 0101

6: 0110

所以一共3個

如果是1顯示當前位置資料,不是1則不顯示,用字串「123」匹配後結果為:

231 3

12即:

2313

12方法很土,不過可以實現功能,夠一般用。

二、示例**

下面是c++的示例**:

view code

1/*2

file : combination.cpp

3author : mike

4e-mail : [email protected]*/

6 #include

7 #include

8 #include

9 #include

10 #include

1112

using

namespace std;

1314

//計算資料中二進位制資料中1的個數

15int count(unsigned int v)

16 23

return ret;

24 }

2526

//檢測pos位置的二進位制資料是否是1

27bool check(unsigned int v,int pos)

28 36 tmp <<= pos;

37return (v & tmp);

38 }

3940

int main()

41 56

//簡單檢查資料

57while(num > szvstr or num ==0 )

58

6263 unsigned int counter = 1;

64 counter <<= szvstr;

65int szunsign = sizeof(unsigned int) * 8;

6667

int total = 0;

68//

輸出組合結果

69for(i=0;i70

78 cout<79 ++total;

80 }

81 }

82 cout <

total =

"<83 }

三、執行效果1、輸入資料:

首先輸入集合的大小,比如15 

接下來輸入每個元素,比如01、

02、03。。。15 

最後輸入要選的組合,比如「15選

5」的話就輸入5 

具體如下:

2、執行結果: 

這裡會輸出各種組合(「15選5」的各種組合),並輸出各種組合的總個數,具體如下: 

其他:python實現**:

import itertools

tmpl=

for i in range(1,16):

cmbresult = list(itertools.combinations(tmpl,5))

for data in cmbresult :

print data

print len(cmbresult)

好,就這些了,希望對你有幫助。

演算法(15) 各種常用的排序演算法

僅記錄學習筆記,如有錯誤歡迎指正。記錄一下常用的陣列的各種排序 複雜度o n2 public static void bubblesort int array int length array.length 外層迴圈控制比較輪數i for int i 0 i length i 複雜度o n2 pub...

1056 組合數的和 15

給定n個非0的個位數字,用其中任意2個數字都可以組合成1個2位的數字。要求所有可能組合出來的2位數字的和。例如給定2 5 8,則可以組合出 25 28 52 58 82 85,它們的和為330。輸入格式 輸入在一行中先給出n 1輸出格式 輸出所有可能組合出來的2位數字的和。輸入樣例 3 2 8 5輸...

1056 組合數的和 (15 分)

這道題出的不嚴謹,萬一有重複的數字就會出錯,例如3 2 2 2 輸出結果為132其實只能組成22這一種二位數。1056 組合數的和 15 分 給定 n 個非 0 的個位數字,用其中任意 2 個數字都可以組合成 1 個 2 位的數字。要求所有可能組合出來的 2 位數字的和。例如給定 2 5 8,則可以...