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語言提供了一種稱為「枚舉」的類型。在「枚舉」類型的定義中列舉出所有可能的取值, 被說明為該「枚舉」類型的變數取值不能超過定義的范圍。應該說明的是, 枚舉類型是一種基本數據類型,而不是一種構造類型, 因為它不能再分解為任何基本類型。