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

目录

一、找凶手

二、跳水排名

三、杨辉三角打印


一、找凶手

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

先上代码

#include
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
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个人排名都不一样。

三、杨辉三角打印

找凶手,排名次,杨辉三角打印_第1张图片

基础款

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

找凶手,排名次,杨辉三角打印_第2张图片

通过数组的形式实现

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

for (i=0;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
#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

只是好看点哈哈

找凶手,排名次,杨辉三角打印_第3张图片

你可能感兴趣的:(数学建模)