- 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;
}