C推理类题

一.5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
1.先把各选手的话用逻辑表达式写出。
b = 2 || a = 3
b = 2 || e = 4
c = 1 || d = 2
c = 5 || d = 3
e = 4 || a = 1
2.A~E都有1-5的可能,全部罗列出来。
3.判断师是否符合每位选手都说对了一半.
4.判断名次是否有重复(我用判断1,2,3,4,5是否都有人来确定是否有重复).

#include<stdio.h>
#include<stdlib.h>
//判断名次是否有重复
int check_5(int a, int b, int c, int d, int e){
 for (int i = 1; i < 6; i++){
  if (i != a &&i != b &&i != c && i != d && i != e){
   return 0;
  }
 }
 return 1;
}
int main(){
 //罗列出所有情况
 for (int a = 1; a < 6; a++){
  for (int b = 1; b < 6; b++){
   for (int c = 1; c < 6; c++){
    for (int d = 1; d < 6; d++){
     for (int e = 1; e < 6; e++){
      //判断说对一半
      if ((2 == b && 3 != a) || (2 != b && 3 == a)){
       if ((2 == a && 4 != e) || (2 != b && 4 == e)){
        if ((1 == c && 2 != d) || (1 != c && 2 == d)){
         if ((5 == c && 3 != d) || (5 != c && 3 == d)){
          if ((4 == e && 1 != a) || (4 != e && 1 == a)){
           //最终判断
           if (check_5(a, b, c, d, e) == 1){
            printf("a=%d,b=%d,c=%d,d=%d,e=%d\n"
             , a, b, c, d, e);
           }
          }
         }
        }
       }
      }
     }
    }
   }
  }
 }
 system("pause");
 return 0;;
}

二.日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个
嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
 //用0表示不是罪犯1表示是罪犯
 //则A:A=0
 //B:C=1
 //C:D=1
 //D:D = 0且三人为真,一人为假
 //初始化没人犯罪
 //用二维数组储存,a[][0]是名称,a[][1]是是否犯罪
 char a[4][2] = { { 'A', '0' }, { 'B', '0' }, { 'C', '0' }, { 'D', '0' } };
 //轮流是罪犯。看哪个符合
 for (int i = 0; i < 4; i++){
  a[i][1] = '1';
  //符合的话输出
  if ((a[0][1] == '0') + (a[2][1] == '1') + (a[3][1] == '1') + (a[3][1] == '0') == 3){
   printf("%c是罪犯\n", a[i][0]);
   break;
  }
  //不符合的话将其在归0,为了下次判断
  a[i][1] = '0';
 }
 system("pause");
 return 0;
}

三.在屏幕上打印杨辉三角。
1.先建了一个一维数组全部为0,然后使中间的为1。(第一列与最后一列不看,纯用来加)
2.从第1列到倒数第二列的数,先用一个数把这个数保存下来,然后这个数等于前一个数(保存的数)加后一个数。
3.循环n次。(输出n行,输出时,0为 空格)如:n=5
00000100000
00001010000
00010201000
00103030100
01040604010

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ROW 100
//打印一行杨辉三角
void print_arr(int n, int* arr){
 for (int row = 1; row <= 2 * n+1; row++){
  if (arr[row] == 0){
   printf("    ");
   continue;
  }
  printf("%4d", arr[row]);
 }
 printf("\n");
}
//打印N行杨辉三角
void print(int n,int temp,int *arr){
 int num1 = 0;
 int num2 = 0;
 while (temp!=-1){
  print_arr(n, arr);
  for (int col = 1; col <= 2 * n + 1; col++){
   num2 = arr[col];
   arr[col] = num1 + arr[col + 1];
   num1 = num2;
  }
  temp--;
 }
}
int main(){
 int n;
 int arr[ROW] = {0};
 printf("请输入要打印几行杨辉三角:");
 scanf("%d", &n);
 arr[n + 1] = 1;
 int temp = n;
 print(n, temp, arr);
 system("pause");
 return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值