導航:首頁 > 源碼編譯 > 枚舉所有組合的演算法

枚舉所有組合的演算法

發布時間:2022-07-15 01:02:49

1. 求0-9的所有4個數所有排列組合的枚舉結果

可以重復嗎?例如1111,假如可以重復的話(你沒有說清楚):
千位不能是0,有9中情況,其他位數都有10中選擇,
所以有9*10*10*10=9000個

如果不能重復:(約定C54表示從5個選4的組合,A54表示從5個選4的排列):
則還是首位不能是0,C91;剩下3位還有9個數字,排列;所以
有 C91 * A93 = 9*9*8*7 = 4536 個。

2. 全組合的演算法

總共有26*10*26種可能,如果把沒一個A、B、C的取值進行編號,那麼序號與A、B、C的關系可以是:
序號I=26*26*B+26*A+C=26(26B+A)+C
那麼:
C=I%26
A=(I-C)/26%26
B=(I-C-26A)/26/26

用一重循環來實現上述組合的枚舉,程序如下:
main(){
int i,a,b,c;
for (i=0;i<26*10*26;i++){
c=i%26;
a=(i-c)/26%26;
b=(i-c-26*a)/26/26;
printf("%c%c%c ",a+'A',b+'0',c+'A');
}
}

這實際上是使用的26進制數來實現的,這個26進制三位數是BAC,值等於I,當有更多變數的時候,方法是類似的。

3. C語言枚舉做組合求解

同求,我也沒什麼好的思路

4. 求枚舉組合演算法

#include <iostream>

using namespace std;

int main()
{
for(int count = 0; count < 6; ++count) {
for(int v1 = 1; v1 <= 8; ++v1) { //第一位
for(int v2 = 1; v2 <= 8; ++v2) { //第二位
for(int v3 = 1; v3 <= 8; ++v3) { //第三位
for(int v4 = 1; v4 <= 8; ++v4) { //第四位
for(int v5 = 1; v5 <= 8; ++v5) { //第五位
for(int v6 = 1; v6 <= 8; ++v6) { //第六位
cout << v1 << v2 << v3 << v4 << v5 << v6 << endl;
}
}
}
}
}
}
}
}

5. c++/c語言 枚舉所有組合並輸出

樓上的遞歸實現確實不錯,但是壞處是不方便將所有的排列組合結果保存起來,除非用上全局變數或靜態變數。
如果nCount是固定的,問題就會變得非常簡單,比如當nCount=3的時候,用上3個for循環即可。我借用宏來簡化定義不同nCount情況下的代碼,沒有樓上的遞歸函數方法高明,但是執行效率應該會更高些,且方便收集所有的組合結果。

voidcombineAll(inta[],intnBegin,intnEnd,intnCount)
{
int*buf=newint[nCount*2+1];
int*end=buf,*arr=buf+nCount+1;//intend[nCount];intarr[nCount+1];
end[0]=nEnd-nCount+1;
for(intk=1;k<nCount;k++)
end[k]=end[k-1]+1;
arr[-1]=nBegin-1;

#defineLOOP(k)for(arr[k]=arr[k-1]+1;arr[k]<end[k];arr[k]++)
#defineSTORE{for(intk=0;k<nCount;k++)printf("%d",a[arr[k]]);printf("");}//orwecanpusha[arr[0~nCount]]toavector

switch(nCount){
case1:
LOOP(0)STOREbreak;
case2:
LOOP(0)LOOP(1)STOREbreak;
case3:
LOOP(0)LOOP(1)LOOP(2)STOREbreak;
case4:
LOOP(0)LOOP(1)LOOP(2)LOOP(3)STOREbreak;
case5:
LOOP(0)LOOP(1)LOOP(2)LOOP(3)LOOP(4)STOREbreak;
default:
throw;//orwecanusearecursivefunction
}

#undefLOOP
#undefSTORE

delete[]buf;
}

intmain()
{
inta[]={0,1,2,3,4,5};
intnBegin=0,nEnd=6,nCount=3;
PrintAll(a,nBegin,nEnd-1,nCount,"");
printf(" -------------------- ");
combineAll(a,nBegin,nEnd,nCount);
returngetchar();
}

6. 枚舉法的結構

枚舉演算法的一般結構:while循環。
首先考慮一個問題:將1到100之間的所有整數轉換為二進制數表示。 for i:=1 to 100 do begin
將i轉換為二進制,採用不斷除以2,余數即為轉換為2進制以後的結果。一直除商為0為止。
end; 二進制加法,此時需要數組來幫忙。
program p;
var a:array[1..100] of integer; {用於保存轉換後的二進制結果}
i,j,k:integer;
begin
fillchar(a,sizeof(a),0); {100個數組元素全部初始化為0}
for i:=1 to 100 do begin
k:=100;
while a[k]=1 do dec(k); {找高位第一個為0的位置}
a[k]:=1; {找到了立刻賦值為1}
for j:=k+1 to 100 do a[j]:=0; {它後面的低位全部賦值為0}
k:=1;
while a[k]=0 do inc(k); {從最高位開始找不為0的位置}
write('(',i,')2=');
for j:=k to 100 do write(a[j]); {輸出轉換以後的結果}
writeln;
end;
end.
枚舉法,常常稱之為窮舉法,是指從可能的集合中一一枚舉各個元素,用題目給定的約束條件判定哪些是無用的,哪些是有用的。能使命題成立者,即為問題的解。

7. 枚舉演算法的介紹

在實際問題中, 有些變數的取值被限定在一個有限的范圍內。例如,一個星期內只有七天,一年只有十二個月, 一個班每周有六門課程等等。如果把這些量說明為整型, 字元型或其它類型顯然是不妥當的。 為此,C語言提供了一種稱為「枚舉」的類型。在「枚舉」類型的定義中列舉出所有可能的取值, 被說明為該「枚舉」類型的變數取值不能超過定義的范圍。應該說明的是, 枚舉類型是一種基本數據類型,而不是一種構造類型, 因為它不能再分解為任何基本類型。

閱讀全文

與枚舉所有組合的演算法相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:577
python員工信息登記表 瀏覽:375
高中美術pdf 瀏覽:158
java實現排列 瀏覽:511
javavector的用法 瀏覽:980
osi實現加密的三層 瀏覽:230
大眾寶來原廠中控如何安裝app 瀏覽:912
linux內核根文件系統 瀏覽:241
3d的命令面板不見了 瀏覽:524
武漢理工大學伺服器ip地址 瀏覽:147
亞馬遜雲伺服器登錄 瀏覽:523
安卓手機如何進行文件處理 瀏覽:70
mysql執行系統命令 瀏覽:929
php支持curlhttps 瀏覽:142
新預演算法責任 瀏覽:443
伺服器如何處理5萬人同時在線 瀏覽:249
哈夫曼編碼數據壓縮 瀏覽:424
鎖定伺服器是什麼意思 瀏覽:383
場景檢測演算法 瀏覽:616
解壓手機軟體觸屏 瀏覽:348