[关闭]
@xudongh 2016-10-23T11:45:33.000000Z 字数 1210 阅读 3353

c程序练习--四大湖

计算机


题目:

注意: 总时间限制: 1000ms 内存限制: 65536kB

我国有4大淡水湖。
A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
已知这4个湖的大小均不相等,4个人每人仅答对一个,
请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给的他们的大小排名。

输入
无。

输出
输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。

样例输入

样例输出

  1. (样例输出仅供格式参考,此题只有一个解, 。)

题目图片如下:
image_1avnj0hgb1270t1317li1v3e1vap9.png-106.1kB


答案

  1. #include <stdio.h>
  2. int main(){
  3. int d, h, p, t; //遍历所有可能的四大湖排名情况
  4. for(d=1; d<=4; d++) {
  5. for(h=1; h<=4; h++) {
  6. for(p=1; p<=4; p++) {
  7. for(t=1; t<=4; t++) {
  8. if((d!=h&&d!=p&&d!=t&&h!=p&&h!=t&&p!=t) //保证每个湖的排名大小不同
  9. &&((d==1)+(h==4)+(p==3)==1)
  10. &&((h==1)+(d==4)+(p==2)+(t==3)==1)
  11. &&((h==4)+(d==3)==1)
  12. &&((p==1)+(t==4)+(h==2)+(d==3)==1)
  13. &&((d+h+p+t)==10)) {
  14. printf("%d\n%d\n%d\n%d\n", d, h, p, t);
  15. return 0;
  16. }
  17. }
  18. }
  19. }
  20. }
  21. return 0;
  22. }

分析
对于这道题,其实可以通过笔算慢慢分析即可得出答案,但如何使用编程语言来表示,这是个问题。
答案中,d、h、p、t分别代表洞庭湖、洪泽湖、鄱阳湖和太湖。其编程思想是,通过四个嵌套的for循环,先列出d、h、p、t所有的排列组合,然后再使用最内层的if语句检查是否满足题意。

d!=h&&d!=p&&d!=t&&h!=p&&h!=t&&p!=t表达式保证了四个湖的排名不相等;

而对于if语句中的

  1. ((d==3)+(h==4)+(p==3)==1)
  2. &&((h==1)+(d==4)+(p==2)+(t==3)==1)
  3. &&((h==4)+(d==3)==1)
  4. &&((p==1)+(t==4)+(h==2)+(d==3)==1)
  5. &&((d+h+p+t)==10))

这是通过题意A、B、C、D四人的话中符合“4个人每人仅答对一个”这一情况的组合。通过==运算符判定,若相等,则值为1,否则为0;四项相加为1,说明“每人仅答对一个”

输出结果为:

  1. 2
  2. 4
  3. 1
  4. 3

这道题的解题思路有几点是值得学习的:
1. 先使用四个for循环,结合d、p、h、t四个变量不可能相等的情况,列出它们可能出现的全部排列;
2. 将A、B、C、D四人的话,通过==运算符转化为编程语言;再使用并集,表示“同时满足条件”。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注