马克思手稿中的数学题
1.问题描述
马克思手稿中有一道趣味数学问题:有30个人,其中有男人、女人和小孩,他们在同一家饭馆吃饭,总共花了50先令。已知每个男人吃饭需要花3先令,每个女人吃饭需要花2先令,每个小孩吃饭需要花1先令,请编程求出男人、女人和小孩各有几人。
2.问题分析
根据该问题的描述,可将该问题抽象为一个不定方程组。
设变量x、y和z分别代表男人、女人和小孩,则由题目的要求,可得到如下的方程组:
x+y+z=30 ①
3x+2y+z=50 ②
其中方程①表示男人、女人和小孩加起来总共有30个人。方程②表示30个人吃饭总共花了50先令。
用方程②-方程①,可得:
2x+y=20 ③
由方程③可知,x取值范围为[0,10]。
3.算法设计
在问题分析中,我们抽象出了一个不定方程组,显然得到了不定方程组的解,该问题也就解决了。但不定方程组中包含了x、y、z这3个变量,而方程只有两个,因此不能直接求出x、y、z的值。
而由方程③,我们得到了x的取值范围,因此可将x的有效取值依次代入不定方程组中(即方程①、②和③)中,能使3个方程同时成立的解即为该问题的解。为实现该功能,只需使用一个for循环语句即可。
4.程序流程图
5.源代码
#include<stdio.h> int main() { int x,y,z,number=0; printf(" Men Wonmen Children\n"); for(x=0;x<=10;x++) { y=20-2*x; z=30-x-y; if(3*x+2*y+y+z==50) printf("%2d:%4d%5d%6d\n",++number,x,y,z); } }