谁能帮我用C++编写这么一个小程序

2.A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:(1)A参加时,B也参加;(2)B和C只有一个人参加;(3)C和D或者都参加,或者都... 2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
人参加了竞赛:

(1)A参加时,B也参加;

(2)B和C只有一个人参加;

(3)C和D或者都参加,或者都不参加;

(4)D和E中至少有一个人参加;

(5)如果E参加,那么A和D也都参加。
展开
 我来答
ravingboy
2008-01-29
知道答主
回答量:28
采纳率:0%
帮助的人:0
展开全部
竟然比我还快~像2楼说的,这个就是用位的方法啦
#include <iostream>
#include <cstdlib>

using namespace std;

#define NOTAKE 0
#define TAKE 1

/*每个队员用一个位来表示,从高位到低位分别为EDBCA
相应位为1表示参赛,为0表示不参赛*/
#define A (players & 0x01)
#define B ((players & 0x02)>>1)
#define C ((players & 0x04)>>2)
#define D ((players & 0x08)>>3)
#define E ((players & 0x10)>>4)

int players;

bool check() {

if (((A == TAKE)? B == TAKE: true) /* A参加时,B也参加; */
&& (B != C) /*B和C只有一个人参加; */
&& (C == D) /*C和D或者都参加,或者都不参加;*/
&& (D == TAKE || E == TAKE) /*D和E中至少有一个人参加;*/
&& (E == TAKE? (A == TAKE && D == TAKE): true)) /*如果E参加,那么A和D也都参加。*/ {
return true;
}
return false;
}

int main(int argc, char *argv[])
{
int i;

for (players = 0; players < 32; players++){
if (check()) {
if (A == TAKE) {
cout<<"A ";
}
if (B == TAKE) {
cout<<"B ";
}
if (C == TAKE) {
cout<<"C ";
}
if (D == TAKE) {
cout<<"D ";
}
if (E == TAKE) {
cout<<"E";
}
cout<<endl;
}
}

return EXIT_SUCCESS;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sva2005
2008-01-29
知道答主
回答量:11
采纳率:0%
帮助的人:0
展开全部
// abc.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
//定义五位同学
int S[5]={0,0,0,0,0};
int Check();
int a,b,c,d,e;
int main(int argc, char* argv[])
{
//初始化
for(int i=0;i<5;i++)
S[i] = 0;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
for(e=0;e<=1;e++)
{
S[0]=a;
S[1]=b;
S[2]=c;
S[3]=d;
S[4]=e;
if(Check())
{
for(i=0;i<5;i++)
{
printf("%i",S[i]);
}
printf("\n");
return 0;
}
}
return 0;
}

//检测程序
int Check()
{
//A参加时,B也参加
if(S[0] == 1 && S[1] != 1) return 0;
//B和C只有一个人参加
if(S[1] + S[2] != 1) return 0;
//C和D或者都参加,或者都不参加
if(S[2] + S[3] == 1) return 0;
//D和E中至少有一个人参加
if(S[3] + S[4] == 0) return 0;
//如果E参加,那么A和D也都参加
if(S[4] == 1)
if(S[0] + S[3] != 2)
return 0;
return 1;
}

没想到已经有人先一步把答案写出来了。。。不过我个人觉得这种方法还不是最好的方法,如果可以的话。考虑到用二进制来做这道题目代码长度会有所减少,只是目前还没想出比较好的方法来处理检测程序。所以暂时就没发了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2008-01-29
展开全部
/*A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。
*/

#include <stdio.h>
int check(int* nums);
int main()
{int a,b,c,d,e,num[5];
printf("可能的组合是:\n");
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
for(e=0;e<=1;e++)
{
num[0]=a;
num[1]=b;
num[2]=c;
num[3]=d;
num[4]=e;
if(check(num))
{
if(a==1)printf("a ");
if(b==1)printf("b ");
if(c==1)printf("c ");
if(d==1)printf("d ");
if(e==1)printf("e ");
printf("\n");
};
}
}
int check(int* nums)
{
int a,b,c,d,e;
a=nums[0];
b=nums[1];
c=nums[2];
d=nums[3];
e=nums[4];
if(a==1&&b!=1)return 0;
if(b==1&&c==1)return 0;
if(c==1&&d!=1)return 0;
if(c!=1&&d==1)return 0;
if(d!=1&&e!=1)return 0;
if(e==1&&(a!=1||d!=1))return 0;
return 1;
}

执行结果:

可能的组合是:
c d

题目地址:http://post.baidu.com/f?kz=104791113

参考资料: http://post.baidu.com/f?kz=104791113

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sukiming1
2008-01-29
知道答主
回答量:6
采纳率:0%
帮助的人:0
展开全部
. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。

#include <stdio.h>
int check(int* nums);
int main()
{int a,b,c,d,e,num[5];
printf("可能的组合是:\n");
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
for(e=0;e<=1;e++)
{
num[0]=a;
num[1]=b;
num[2]=c;
num[3]=d;
num[4]=e;
if(check(num))
{
if(a==1)printf("a ");
if(b==1)printf("b ");
if(c==1)printf("c ");
if(d==1)printf("d ");
if(e==1)printf("e ");
printf("\n");
};
}
}
int check(int* nums)
{
int a,b,c,d,e;
a=nums[0];
b=nums[1];
c=nums[2];
d=nums[3];
e=nums[4];
if(a==1&&b!=1)return 0;
if(b==1&&c==1)return 0;
if(c==1&&d!=1)return 0;
if(c!=1&&d==1)return 0;
if(d!=1&&e!=1)return 0;
if(e==1&&(a!=1||d!=1))return 0;
return 1;
}

执行结果:

可能的组合是:
c d
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式