C语言:马克思手稿中的数学题

问题:

马克思手稿中有一道趣味数学问题:有30个人,其中有男人、女人和小孩,他们在同一家饭馆吃饭,总共花了50先令。已知每个男人吃饭需要花3先令,每个女人吃饭需要花2先令,每个小孩吃饭需要花1先令,请编程求出男人、女人和小孩各有几人。

分析:

根据该问题的描述,可将该问题抽象为一个不定方程组。

设变量x、y和z分别代表男人、女人和小孩,则由题目的要求,可得到如下的方程组:

其中方程 (1) 表示男人、女人和小孩加起来总共有30个人。方程 (2) 表示30个人吃饭总共花了50先令。用 (2) - (1),可得:

2x+y=20  (3)

由方程 (3) 可知,x取值范围为 [0,10]。

算法设计:

在问题分析中我们抽象出了一个不定方程组,显然得到了不定方程组的解,该问题也就解决了。但不定方程组中包含了 x、y、z 这3个变量,而方程只有两个,因此不能直接求出x、y、z的值。

而由方程 (3),我们得到了x的取值范围,因此可将x的有效取值依次代入不定方程组中(即方程 (1)、(2) 和 (3))中,能使3个方程同时成立的解即为该问题的解。为实现该功能,只需使用一个for循环语句即可。

下面是完整的代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int x, y, z, number=0;
  5. printf(" Men Women Children\n");
  6. for( x=0; x<=10; x++ )
  7. {
  8. y = 20 - 2 * x;
  9. z = 30 - x - y;
  10. if(3*x+2*y+z == 50)
  11. printf("%2d:%4d%5d%6d\n", ++number, x, y, z);
  12. }
  13. return 0;
  14. }

运行结果:

Men Women Children

1: 0 20 10

2: 1 18 11

3: 2 16 12

4: 3 14 13

5: 4 12 14

6: 5 10 15

7: 6 8 16

8: 7 6 17

9: 8 4 18

10: 9 2 19

11: 10 0 20

发布了165 篇原创文章 · 获赞 442 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_44015669/article/details/90721778
今日推荐