小朋友们,大朋友们,大家好!今天我们要穿越时空,回到150多年前,和伟大的思想家卡尔·马克思一起解一道有趣的数学题。你没听错,马克思不仅会写《资本论》,还喜欢玩数学谜题呢!
马克思在他的手稿里写了这样一个问题:
有30个人,其中有男人、女人和小孩。他们在一家饭馆吃饭,总共花了50先令。已知每个男人花3先令,每个女人花2先令,每个小孩花1先令。请问男人、女人和小孩各有几人?
先令是当时的一种货币单位,我们不用管它,只需要知道数字关系就行。
我们可以用字母来表示人数:
根据题目,可以写出两个等式:
总人数:x + y + z = 30
总花费:3x + 2y + z = 50
三个未知数,只有两个方程,这叫做不定方程。通常会有多组解,我们需要找出所有可能的整数解(人数不能是半个呀)。
把第二个方程减去第一个方程:
(3x+2y+z) - (x+y+z) = 50 - 30
2x + y = 20
所以 y = 20 - 2x
再把 y 代入第一个方程:
x + (20-2x) + z = 30
20 - x + z = 30
z = 10 + x
现在,x 只要取一些整数,就能算出 y 和 z。而且人数不能为负数,所以:
y = 20 - 2x ≥ 0 → x ≤ 10
x ≥ 0
所以 x 可以是 0,1,2,...,10 一共11种可能。
如果题目暗示男人、女人、小孩都至少有一个,那么 x≥1,y≥1 → 20-2x ≥ 1 → x ≤ 9.5 → x ≤ 9,所以 x 从1到9共9种解。
手工计算虽然简单,但如果我们用编程,可以让电脑自动帮我们找出所有答案!这里介绍两种写代码的方法。
用三个 for 循环,分别尝试男人、女人、小孩的可能人数(0~30),检查是否满足总人数30和总花费50。
print("男人 女人 小孩")
for x in range(0, 31): # 男人 0~30
for y in range(0, 31): # 女人 0~30
for z in range(0, 31): # 小孩 0~30
if x + y + z == 30 and 3*x + 2*y + z == 50: print(f"{x:3} {y:3} {z:3}")
运行结果(节选):会输出11行,因为电脑把0人也算进去了。
我们已经推导出 y = 20 - 2x 和 z = 10 + x,只要 x 从0到10循环,就能直接算出答案,速度快得多!
print("男人 女人 小孩")
for x in range(0, 11): # x 从0到10
y = 20 - 2*x
z = 10 + x # 确保人数都是非负整数(自动满足,但检查一下更安全)
if y >= 0 and z >= 0:
print(f"{x:3} {y:3} {z:3}")
运行结果:
男人 女人 小孩
0 20 10
1 18 11
2 16 12
3 14 13
4 12 14
5 10 15
6 8 16
7 6 17
8 4 18
9 2 19
10 0 20
如果要求三种人都有(男人、女人、小孩都至少1人),那么只取 x 从1到9:
print("男人 女人 小孩")
for x in range(1, 10): # x 从1到9
y = 20 - 2*x
z = 10 + x
print(f"{x:3} {y:3} {z:3}")
结果:
男人 女人 小孩
1 18 11
2 16 12
3 14 13
4 12 14
5 10 15
6 8 16
7 6 17
8 4 18
9 2 19
一共9种可能的组合,都是正确答案!
for x in range(0, 11):让变量 x 从0开始,一直取到10(注意 range 不包含结尾数字11,所以实际是0~10)。
y = 20 - 2*x 和 z = 10 + x利用我们之前推导的公式,直接根据 x 算出女人和小孩的人数。
print(f"{x:3} {y:3} {z:3}")这是一种格式化输出,{x:3} 表示 x 占3个字符的宽度,这样打印出来的表格整整齐齐。
为什么会有多组解?因为题目只给了两个条件(总人数和总花费),三个未知数,所以解不唯一。现实生活中,我们可能需要额外信息(比如小孩比大人多等)才能确定唯一解。
如果男人、女人、小孩都必须至少有1人,那么一共有 9种 可能。你可以试着把每一种代入原题,都满足30人和50先令哦!
如果饭馆老板说“小孩的人数比男人和女人加起来还多”,你能从上面的答案中找到符合条件的那一组吗?(提示:小孩人数 z = 10+x,男人+女人 = x + (20-2x) = 20-x,要求 z > (x+y) → 10+x > 20-x → 2x > 10 → x > 5,所以 x 为6,7,8,9。共有4组。)
请你在自己的电脑上安装Python(或者使用在线的Python编辑器),输入上面的代码,看看能不能得到同样的结果。然后试着修改条件,比如总花费改成60先令,或者总人数改成40人,看看答案会怎么变化。
编程就像解谜一样有趣,数学和代码结合起来,能解决很多实际问题。马克思如果知道后世有Python这样的工具,说不定也会成为编程高手呢!