找凶手,排名次,杨辉三角打印

简介: 找凶手,排名次,杨辉三角打印

一、找凶手

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。

以下为4个嫌疑犯的供词

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手。

先上代码

#include<stdio.h>
int main()
{
  char killer = "A";//先假设凶手是A
  for (;killer<='D'; killer++)
    //对A,B,C,D进行遍历,相当于枚举法然后判断逻辑是否满足要求
  {
    if ((killer!='A')+(killer=='C')+(killer=='D')+(killer!='D')==3)
    {
      printf("凶手是%c", killer);
    }
  }
}

if ((killer!='A')+(killer=='C')+(killer=='D')+(killer!='D')==3)

这一行代码是整个题目的核心,我们再看一眼题目

(1)A说:不是我。

(2)B说:是C。

(3)C说:是D。

(4)D说:C在胡说

已知3个人说了真话,1个人说的是假话。


根据我们之前写的代码,不难将


 (1)写作killer!='A;(2)写作killer=='C';(3)写作killer=='D';(4)写作killer!='D';


由于四个人中有三个人说了真话,那么我们可以就可以得到这串代码


if ((killer!='A')+(killer=='C')+(killer=='D')+(killer!='D')==3)


当这4种情况相加等于3时,即4个人中有三个人说真话,一个人说谎的条件成立那么凶手就是此时枚举出来的内容

二、跳水排名

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一;

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

先上代码

#include<stdio.h>
int main()
{
  int a, b, c, d, e = 0;
  for (a=1;a<=5;a++)
  {
    for (b=1;b<=5;b++)
    {
      for (c=1;c<=5;c++)
      {
        for (d=1;d<=5;d++)
        {
          for (e=1;e<=5;e++)
          {
            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*c*d*e==120))
            {
              printf("a的排名为%d b的排名为%d c的排名为%d d的排名为%d e的排名为%d\n", a, b, c, d, e);
            }
          }
        }
      }
    }
  }
}

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*c*d*e==120))


这一行是这道题的灵魂,前面的for循环,跟之前找凶手是一样的,是对名次的遍历


再看一眼题目


(1)A选手说:B第二,我第三;


(2)B选手说:我第二,E第四;


(3)C选手说:我第一,D第二;


(4)D选手说:C最后,我第三;


(5)E选手说:我第四,A第一;


比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。


不难将如找凶手一般将(1)写作(b==2)+(a==3)==1


                               将(2)写作(b==2)+(e==4)==1


                               将(3)写作(c==1)+(d==2)==1


                               将(4)写作(c==5)+(d==3)==1


                               将(5)写作(e==4)+(a==1)==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==3,d也==3


为了杜绝这种情况我们可以再加上一个条件a*b*c*d*e==120(1*2*3*4*5==120)


确保每次出来的结果5个人排名都不一样。

三、杨辉三角打印

基础款

#include<stdio.h>
#define N 100
int main()
{
  int i, j,n = 0;
  int a[N][N] = { 0 };
  printf("请输入要打印的行数\n");
  scanf("%d" ,&n);
  for (i=0;i<n;i++)
  {
    a[i][i] = a[i][0] = 1;
    }
  for (i = 2; i <= n; i++)
  {
    for (j = 1; j < i; j++)
    {
      a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
    }
  }
  for (i = 0; i < n; i++)
  {
    for (j = 0; j <= i; j++)
    {
      printf("%d ", a[i][j]);
    }
    printf("\n");
  }
}

通过数组的形式实现

这一串代码用于初始化数组每一行的左右两端为1(杨辉三角的特性)

for (i=0;i<n;i++)

   {

       a[i][i] = a[i][0] = 1;

   }


从第三行开始打印,而除了1以外的数据,都可以通过上一行的两个元素得来


   重点:a[i][j] = a[i - 1][j - 1] + a[i - 1][j];


for (i = 2; i <= n; i++)

   {

       for (j = 1; j < i; j++)

       {

           a[i][j] = a[i - 1][j - 1] + a[i - 1][j];

       }

   }


把一切元素都放进去以后变可以开始打印了,两个for循环搞定


升级版

#include<stdio.h>
#define N 100
int main()
{
  int i, j,n,k = 0;
  int a[N][N] = { 0 };
  printf("请输入要打印的行数\n");
  scanf("%d" ,&n);
  for (i=0;i<n;i++)
  {
    a[i][i] = a[i][0] = 1;
    }
  for (i = 2; i <= n; i++)
  {
    for (j = 1; j < i; j++)
    {
      a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
    }
  }
  for (i = 0; i < n; i++)
  {
    for (k=i;k<n;k++)//添加空格美观
    {
      printf("  ");
    }
    for (j = 0; j <= i; j++)
    {
      printf("%4d ", a[i][j]);//添加宽度因素
    }
    printf("\n");
  }
}

只是好看点哈哈


相关文章
|
2月前
输出九九乘法口诀表
【10月更文挑战第19天】输出九九乘法口诀表。
60 5
|
3月前
打印楼梯
打印楼梯。
33 8
|
7月前
|
机器学习/深度学习
PTA-打印九九口诀表
该程序生成1到N的下三角九九乘法表。输入一个1到9的正整数N,输出1*1到N*N的乘法表达式,等号右侧数字左对齐且占4位。示例输入4,输出1*1=1至4*4=16的口诀表。代码通过输入n值,使用两层循环结构实现乘法规则的打印。
127 0
|
7月前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
7月前
除夕日的每日一题(字符个数统计,多数元素)
除夕日的每日一题(字符个数统计,多数元素)
41 2
|
C语言
【C语言】【典例详解】【刷题】猜名次&&猜凶手【循环练习】
【C语言】【典例详解】【刷题】猜名次&&猜凶手【循环练习】
191 0
|
存储 算法 C语言
【C语言刷题】猜名次、猜凶手、杨辉三角、杨氏矩阵、字符串左旋、判断是否为左旋子串
【C语言刷题】猜名次、猜凶手、杨辉三角、杨氏矩阵、字符串左旋、判断是否为左旋子串
80 0
倒置字符串、猜名次、猜凶手、杨辉三角(上)
倒置字符串、猜名次、猜凶手、杨辉三角(上)
倒置字符串、猜名次、猜凶手、杨辉三角(下)
倒置字符串、猜名次、猜凶手、杨辉三角(下)