楼上的递归实现确实不错,但是坏处是不方便将所有的排列组合结果保存起来,除非用上全局变量或静态变量。
如果nCount是固定的,问题就会变得非常简单,比如当nCount=3的时候,用上3个for循环即可。我借用宏来简化定义不同nCount情况下的代码,没有楼上的递归函数方法高明,但是执行效率应该会更高些,且方便收集所有的组合结果。
void combineAll(int a[], int nBegin, int nEnd, int nCount)
{
int buf = new int[nCount 2 + 1];
int end = buf, arr = buf + nCount + 1; //int end[nCount]; int arr[nCount+1];
end[0] = nEnd - nCount + 1;
for(int k = 1; k < nCount; k++)
end[k] = end[k - 1] + 1;
arr[-1] = nBegin - 1;
#define LOOP(k) for(arr[k] = arr[k - 1] + 1; arr[k] < end[k]; arr[k]++)
#define STORE { for(int k = 0; k < nCount; k++) printf("%d", a[arr[k]]); printf(" "); } //or we can push a[arr[0~nCount]] to a vector
switch(nCount) {
case 1:
LOOP(0) STORE break;
case 2:
LOOP(0) LOOP(1) STORE break;
case 3:
LOOP(0) LOOP(1) LOOP(2) STORE break;
case 4:
LOOP(0) LOOP(1) LOOP(2) LOOP(3) STORE break;
case 5:
LOOP(0) LOOP(1) LOOP(2) LOOP(3) LOOP(4) STORE break;
default:
throw; //or we can use a recursive function
}
#undef LOOP
#undef STORE
delete[] buf;
}
int main()
{
int a[] = { 0,1,2,3,4,5 };
int nBegin = 0, nEnd = 6, nCount = 3;
PrintAll(a, nBegin, nEnd - 1, nCount, "");
printf("\n--------------------\n");
combineAll(a, nBegin, nEnd, nCount);
return getchar();
}
3号最佳,D说对了,java控制台程序如下:
public static void main(String[] args) {
Comment commentA = new Comment(2, CommentStateBEST);
Comment commentB = new Comment(4, CommentStateBEST);
Comment commentC = new Comment(3, CommentStateNOT_BEST);
Comment commentD = commentBnegate();
Comment[] comments = {commentA, commentB, commentC, commentD};
int correctCommentNumber = 0, correctCommentCount;
for (int i = 1; i <= 4; ++i) {
correctCommentCount = 0;
Comment theFact = new Comment(i, CommentStateBEST);
for (Comment comment : comments) {
if (theFactisCorrect(comment)) {
correctCommentCount++;
correctCommentNumber = i;
}
}
if (correctCommentCount == 1) {
Systemoutprintln("Car number " + i + " is the best");
Systemoutprintln("Expert number " + correctCommentNumber
+ " is correct");
}
}
}
static class Comment {
public enum State {
BEST {
public State negate() {
return NOT_BEST;
}
},
NOT_BEST {
public State negate() {
return BEST;
}
};
public abstract State negate();
}
public Comment(int number, State state) {
thisnumber = number;
thisstate = state;
}
public Comment negate() {
return new Comment(number, statenegate());
}
public boolean isCorrect(Comment comment) {
if (state == StateBEST) {
return (commentstate == StateBEST) == (commentnumber == number);
} else {
return commentstate == StateNOT_BEST && commentnumber == number;
}
}
private int number;
private State state;
}
1、枚举常量是枚举类型中的值,即枚举值。枚举类型是一种用户定义的类型,只有用户在程序中定义它后才能被使用。用户通常利用枚举类型定义程序中需要使用的一组相关的符号常量。
2、枚举类型的定义格式为:enum枚举类型名> {枚举表>};它是一条枚举类型定义语句,该语句以enum保留字开始,接着为枚举类型名,它是用户命名的一个标识符,以后就直接使用它表示该类型,枚举类型名后为该类型的定义体,它是由一对花括号和其中的枚举表所组成,枚举表为一组用逗号分开的由用户命名的符号常量,每个符号常量又称为枚举常量或枚举值。
枚举类型enum的用法如下文所示:
枚举enum就是英文enumerate的缩写,也就是呢列举、排列说明的意思。枚举类型是C语言中的一种特殊类型,枚举类型可以让我们的程序使用一些固定长度和固定数值的变量值范围。定义枚举类型:enum 枚举类型 {枚举值列表};
1、定义枚举类型
2、如果在定义枚举类型时指定元素的值,也可以改变枚举元素的值
例如:
enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}day;
这时,sun 为 7,mon 为 1,以后元素顺次加 1,所以 sat 就是 6 了。
3、枚举值可以用来作判断
例如:
if (day==month) {…}
if (day>month) {…}
枚举值的比较规则是:按其在说明时的顺序号比较,如果说明时没有人为指定,则第一个枚举元素的值认作 0。
4、一个整数不能直接赋给一个枚举变量,必须强制进行类型转换才能赋值
enum
Grade
{
不及格,
及格,
优秀
}
class
Program
{
static
void
Main(string[]
args)//用C#代码的for语句做这道题
列出所以的N位数,要求各位数上的数字和为M
{//分解n。n=2时2=1+1;n=3时,3=2+1;3=2+1+1;
List<float>
list
=
new
List<float>();
int
i
=
1;
float
sum
=
0;
while
(i
<11)
{
ConsoleWriteLine("请输入第{0}个人的成绩:",i);
float
grade
=
floatParse(ConsoleReadLine());
listAdd(grade);
i++;
}
listSort();
sum=listSum();
ConsoleWriteLine("平均分为{0},最高分为{1},最低分为{2}",sum/10,list[9],list[0]);
for
(int
j
=
9;
j
>=
0;
j--)
{
if
(list[j]
<
60)
{
ConsoleWriteLine("{0}:
"+Grade不及格,list[j]);
}
else
if
(list[j]
<
90)
{
ConsoleWriteLine("{0}:
"
+
Grade及格,
list[j]);
}
else
{
ConsoleWriteLine("{0}:
"
+
Grade优秀,
list[j]);
}
}
}
枚举通过使用enum,可以创建一个新的类型,并且制定它可以具有的值(实际上是INT型的,虽然大多用字符来枚举,可是这些字符都代表的是INT型的整数常量)主要的使用目的是为了增加程序的可读性。
简单来说,就是我们在选择分支的时候,可以定义一个变量来确定各个分支的顺序,比如0,1,2,3,4,。。但是这样不好读,尤其是编写者之外的人读,很让人费解,这个时候可以,012,3,4。。赋予一些实际的含义。典型的例子:
比如我们可以这样用:
enum spectrum {red,orange,yellow,green,blue,violet};
enum spectrum color;
以上定义了color的可能值red,orange等等。
以下是应用:
int c;
color=blue;
if (color == yellow)
;
这些都是我自己所学到,所理解的
以上就是关于c++/c语言 枚举所有组合并输出全部的内容,包括:c++/c语言 枚举所有组合并输出、用枚举法编程、枚举类型enum用法 c语言switch的用法是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)