练习题目7

  1. 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
    A选手说:B第二,我第三;
    B选手说:我第二,E第四;
    C选手说:我第一,D第二;
    D选手说:C最后,我第三;
    E选手说:我第四,A第一;
    比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
    思路:A,B,C,D,E五人每人都有可能是第一名到第五名,所以五层for循环列出所有可能性。
    最内层加上条件:a:每人的话都只说对了一半,即两个条件中一个为真,一个为假,相加和为1.b:并且两两运动员名次不相等。
    根据以上条件即可判断出每个运动员的名次。
    代码如下:
#include<stdio.h>
#include<stdlib.h>
 int main(void){
  int a = 0, b = 0, c = 0, d = 0, e = 0;
  //A,B,C,D,E五人每人都有可能是第一名到第五名,所以五层for循环列出所有可能性
  for (a = 1; a < 6; ++a){
   for (b = 1; b < 6; ++b){
    for (c = 1; c < 6; ++c){
     for (d = 1; d < 6; ++d){
      for (e = 1; e < 6; ++e){
       //每人都说对一半,两个条件一个为真(1),另一个为假(0),加起来为1
       //并且每个名次各有一人,不可能重复,两两运动员的名次各不相等
       if ((b == 2) + (a == 3) == 1
        && (b == 2) + (e == 4) == 1
        && (c == 1) + (d == 2) == 1
        && (c == 5) + (d == 3) == 1
        && (e == 4) + (a == 1) == 1 &&
        (a != b) && (a != c) && (a != d) && (a != e) && (b != c) && 
        (b != d) && (b != e)&& (c != d) && (c != e) && (d != e)){
         printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);   
       }
      }
     }
    }
   }
  }
 system("pause");
 return 0;
}

在这里插入图片描述
2. 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个
嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
思路:a,b,c,d 四人每人都有可能是凶手或者不是凶手,0代表不是凶手,1代表是凶手,用四层循环列出所有可能。
在最内层循环中加上条件:a:有一人说谎,说明四个条件中一个为假,三个为真,相加和为3。b:四人中必有一个凶手,1代表是凶手,所以判断a+b+c+d==1。
根据以上条件便可找出谁是凶手。
代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void Func(){
 int a = 0, b = 0, c = 0, d = 0;
 //1代表凶手,0代表不是凶手
 //a,b,c,d四人每个人都有可能是凶手或不是凶手
 for (a = 0; a < 2; ++a){
  for (b = 0; b < 2; ++b){
   for (c = 0; c < 2; ++c){
    for (d = 0; d < 2; ++d){
    // 三人说真话,四个==式子中有三个结果为1所以加起来为3.并且有一人是凶手,是1,
    // 其他三人不是凶手,均为0,所以判断a + b + c + d 是否等于 1
     if (((a == 0) + (c == 1) + (d == 1) + (d == 0) == 3) && a + b + c + d == 1){
      printf("a=%d b=%d c=%d d=%d", a, b, c, d);
          }
        }
      }
    }
  }
}
 int main(void){
  Func();
  system("pause");
  return 0;
 }

在这里插入图片描述

3.在屏幕上打印杨辉三角。
1
1 1
1 2 1
1 3 3 1
思路:先定义一个足够大的二维数组,初始化为0.用两层循环来控制二维数组的下三角打印为杨辉三角:外层循环控制行,内层次循环控制列。第0列全为1,所以将1赋值给arr[i][0]。当i==j时,arr[i][j]也为1。其他元素计算方法均为头上两元素之和:arr[i][j]=arr[i-1][j] + arr[i - 1][j - 1]
代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define Max 100
void Triangle(int num){
int arr[Max][Max] = { 0 };
 int i = 0;
 int j = 0;
 for (i = 0; i < num; ++i){
  for (j=0; j <= i; ++j){
  //将第0列元素赋为1
  arr[i][0] = 1;
  //对角线上元素赋为1
   if (i == j){
    arr[i][j]=1;
   }
   //其他元素
   else if(j!=0){
   arr[i][j]=arr[i-1][j] + arr[i - 1][j - 1];
   }
   printf("%d\t", arr[i][j]);
  }
  printf("\n");
 }
}
int main(void){
//输入想打印杨辉三角的行数
  int num = 0;
  scanf("%d", &num);
  Triangle(num);
  system("pause");
  return 0;
 }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44779696/article/details/88992708