今天有個網友問我組合數生成演算法的問題,這個寫的早,只給他回覆了原理。剛好這段時間玩「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三、執行效果1、輸入資料: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 }
首先輸入集合的大小,比如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,則可以...