关键词搜索

源码搜索 ×
×

C语言经典问题—猜名次、猜凶手和杨辉三角

发布2023-01-04浏览362次

详情内容

一、猜名次问题

题目内容

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

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

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

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

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

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

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

解决思路和代码

思路:暴力解决,通过 嵌套循环 列出所有可能性,从A选手为第一名、第二名........的每一种可能进行判断,当满足条件时,将结果输出。

  1. int main()
  2. {
  3. int A, B, C, D, E;
  4. for (A = 1; A < 6; A++)
  5. {
  6. for (B = 1; B < 6; B++)
  7. {
  8. for (C = 1; C < 6; C++)
  9. {
  10.            for (D = 1; D < 6; D++)
  11.             {
  12.                 for (E = 1; E < 6; E++)
  13.                 {
  14.                     if ((B == 2) + (A == 3) == 1 &&
  15.                         (B == 2) + (E == 4) == 1 &&
  16.                         (C == 1) + (D == 2) == 1 &&
  17.                         (C == 5) + (D == 3) == 1 &&
  18.                         (E == 4) + (A == 1) == 1 &&
  19.                         A * B * C * D * E == 120) //确保ABCD选手的排名不会重复
  20.                         printf("%d %d %d %d %d\n", A, B, C, D, E);
  21.                 }
  22.              }
  23. }
  24.     }
  25. }
  26. }

存在选手排名相同,也会满足条件,所以确定A*B*C*D为固定值,从而使结果只有一种(无重复的结果

二、找凶手问题

题目内容

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

以下为4个嫌疑犯的供词:

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

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

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

解决思路和代码

思路:假设凶手为A,再通过 题目条件 判断是否成立,如果成立则输出结果,如果不成立则再假设B、C、D。

  1. int main()
  2. {
  3. char killer = ' ';
  4. for (killer = 'A'; killer <= 'D'; killer++)
  5. {
  6. if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
  7. {
  8. printf("killer is %c", killer);
  9. }
  10. }
  11. return 0;
  12. }

提前假设凶手,再通过题目条件,判断,是否三人说真话,1人说假话 成立

三、 杨辉三角问题

题目内容

在屏幕上打印杨辉三角

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

……

解决思路和代码

思路:杨辉三角,每一行的第一个数和最后一个数为1,其余数皆是它左上方和正上方的数的和。也可以理解为,两端元素为1,只需要修改中间元素

二维数组可以寻找数的左上方和正上方的数,从而进行相加。

  1. int main()
  2. {
  3. int arr[100][100] = { 0 };
  4. int a = 0;
  5. scanf("%d", &a); //输入行数
  6. //写一个框架,全为1
  7. for (int c = 0; c < a; c++)
  8. {
  9. for (int k = 0; k <= c; k++)
  10. {
  11. arr[c][k] = 1;
  12. }
  13. }
  14. //当行数超过2行时,开始修改中间元素
  15. for (int c = 2; c < a; c++)
  16. {
  17. for (int k = 1; k < c; k++) //因为只需要修改中间元素,k等于1,相当于从每一行第二个元素进行修改
  18. { //当k<c时,也就是说每一行的最后一个数不需要修改,依然为1
  19. arr[c][k] = arr[c - 1][k - 1] + arr[c - 1][k];
  20. }
  21. }
  22. for (int c = 0; c < a; c++)
  23. {
  24. for (int k = 0; k <= c; k++)
  25. {
  26. printf("%d ", arr[c][k]);
  27. }
  28. printf("\n");
  29. }
  30. }

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载