一、找凶手
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为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"); } }
只是好看点哈哈