目录
1.猜名次
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
1.1思路
首先参加这场比赛的五个人都有可能是第一名,也就是说只要要套用五次的for循环来模拟计算
而且ABCDE五人都只是说对了一半,要使他们的条件全部成立就要用到 && 判断每个条件都为真。
最后的乘积判断是为了过滤所有运算中的重名,不然一堆数据无法分辨出正确的答案
1.2代码实现
#include<stdio.h>
int main()
{
int a, b , c , d, e ;
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);
}
}
}
}
}
return 0;
}
2.《猜凶手》
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
2.1思路
本质上来说是对每个人(字符)开关条件来判断,首先已知有三人真话,那通过的条件就是3,而它们的话我们要一一排查,所以要一个for循环来处理。
已知A到D一共四人,我们就在四个人直接排查。
2.2代码实现
#include<stdio.h>
int main()
{
char killer = 0;
for(killer='A'; killer <= 'D'; killer++)
{
if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
{
printf("killer is %c", killer);
}
}
return 0;
}
既然说了是以开关条件(true/false)判断,那也就是可以转换成0 1的形式加起来判断到底等不等于三,等于那就是判断出了凶手,用%c将存储在char的值转换为字符输出。
3.《杨辉三角》
在屏幕上打印杨辉三角。
1
1 1
1 2 1
1 3 3 1
……
3.1思路
杨辉三角算是非常经典的编程题目,其规律就是第三个数为上两个数的相加值,首先创建一个二维数组然后全部初始化为1
在然后对其中间的数组进行相加并打印出来。
3.2代码实现
#include<stdio.h>
int main()
{
int arr[100][100] = { 0 };
int i = 0;
int j = 0;
int line = 0;
scanf("%d", &line);
//根据行数全部初始化为1
for (i = 0; i < line; i++)
{
for (j = 0; j <=i; j++)
{
arr[i][j] = 1;
}
}
//元素相加
for (i = 2; i < line; i++)
{
for (j = 1; j < i; j++)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
//打印
for (i = 0; i < line; i++)
{
for (j = 0; j <=i; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
这边我使用三个for循环来分别控制初始化,相加 ,打印, 当第一个for循环没到2之前可以把前三个1打印出来。
等i到2之后就该第二个for循环起作用了,将上面两个数相加然后放到中间。
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
最后根据line打印出杨辉三角