逻辑判断-谁做了好事!

202321332007 赖志平 软件23 2023-11-04 19:05:51

 

某班中的一位同学做了好事不留名,表扬信来了之后,班主任问A,B,C,D,E,F 六位同学是谁做的好事,六位的回答如下:

   A说:不是我。
     
   B说:是C。
     
   C说:是D。
     
   D说:C胡说。
     
   E说:不是C就是E
     
   F说:即不是D也不是E

 如果N个人说的是真话,则根据这些信息,找出可能做了好事的人。

输入格式:

输入N,N个人可能说的是真话

输出格式:

有可能做好事的同学(A-F),如果有多位同学有可能做好事,则同学名称按字典序全部输出。同学名之间用" or "间隔。
如果无法找出,输出"Error"。

输入样例:

2

输出样例:

在这里给出相应的输出。例如:

A or D

 这一题刚刚做是比较有意思的,要我们自己算都要一个个尝试,但计算机最喜欢这样的事。

这一题和前面的循环练习不一样,这题只有1个输入,输出,所以任何判断是关键。先我们自己想,我们做这个要从A是否对,B是否对等等,一个个算。然后我们可以先假设只有一个同学说真话,那么我们从A到F单一进行判断,假如A说真话,到计算机我们可以让结果为A=1,其他为0,来实现判断A说的是真话。以此类推有多个人说真话我们也可以这样来解决。结果我们现在知道了,开始推过程。我们如何让A=1,B=1等等依次进行?之前学的嵌套循环就开始用了,只要我们让A,B等等始终在0和1之间就可以解决了。

for(f=0;f<=1;f++){
        for(e=-0;e<=1;e++){
            for(d=0;d<=1;d++){
                for(c=0;c<=1;c++){
                    for(b=0;b<=1;b++){
                        for(a=0;a<=1;a++){

这段代码可以让他们始终在0和1之间。接着是如何判断了。首先我们有N个人说真话,我们刚刚开始让说真话的为1,所以我们可以让A+B+C+D+E+F=N就可以实现(当然这只是我的方法)接着判断他们有几个是真话也可以用类似的方法,用我们之前学的&&和||实现

a+b+c+d+e+f==1&&(a==0)+(c==1)+(d==1)+(d==0)+(c==1||e==1)+(d==0&&e==0)==N

这段代码就是判断是否该次循环是否成立,然后就输出。

#include<stdio.h>
int main(){
    int N;
    scanf("%d",&N);
    int a,b,c,d,e,f;
    int t=0;
    for(f=0;f<=1;f++){
        for(e=-0;e<=1;e++){
            for(d=0;d<=1;d++){
                for(c=0;c<=1;c++){
                    for(b=0;b<=1;b++){
                        for(a=0;a<=1;a++){
                            if(a+b+c+d+e+f==1&&(a==0)+(c==1)+(d==1)+(d==0)+(c==1||e==1)+(d==0&&e==0)==N){
                                if(t==1)printf(" or ");   //判断是否输出"or"
                                 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");
                                 if (f==1)printf("F");
                                 t=1;                    //t在第一次输出后要赋值,不然"or"无法输出
                            }
                            
                        }
                    }
                }
            }
        }
    }
    if(t==0){printf("Error");
	}
    return 0;
}

输入:2

输出:A or D

输入:3

输出:B or E or F

 

...全文
96 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
张老师 2023-11-16
  • 打赏
  • 举报
回复

运用了穷举算法,还可以分析一下其特点、不足和改进。

211

社区成员

发帖
与我相关
我的任务
社区描述
程序设计基础课程教学群
c语言c++ 高校 福建省·厦门市
社区管理员
  • xmzq001
  • 鹿饮涧鸣
  • jiangxiaoju
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请加入学习社区的软件23级同学修改社区昵称为学号+姓名,以便登记作业提交情况。

试试用AI创作助手写篇文章吧