导航:首页 > 源码编译 > 枚举所有组合的算法

枚举所有组合的算法

发布时间: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 浏览:159
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