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语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值, 被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是, 枚举类型是一种基本数据类型,而不是一种构造类型, 因为它不能再分解为任何基本类型。