著名小学奥数题 “牛吃草问题” 曾在我小学时期留下了很深的印象:几乎所有的奥数算术题我都能看懂答案,就这个看不懂。

最近还研究行测题,行测有很多搞事的计算题,那我想直接用 MATLAB 解决牛吃草问题。

牛吃草问题是这样的:

牛顿曾编过这样一道题目(牛顿:这个我真说过。):

牧场上有一片青草,每天都生长得一样快。这片青草供给10头牛吃,可以吃22天,或者供给16头牛吃,可以吃10天,期间一直有草生长。如果供给25头牛吃,可以吃多少天?

实际上牛吃草问题是一种方程组问题,3 个方程组解 4 个未知量:

牛吃草的速度:speed_cow

草生长的速度:speed_grass

题目给出牛吃草的天数:cowday1=22、cowday2=10

题目给出多少牛:cowcount1=10、cowcount2=16

草场一开始的草量:s

题目给出多少牛:cowcount=25

题目让求的牛吃草天数:cowday

$speed_cowcowday1cowcount1=s+speed_grass*cowday1$

$speed_cowcowday2cowcount2=s+speed_grass*cowday2$

$speed_cowcowdaycowcount=s+speed_grass*cowday$

接下来只需要令speed_cow=1即可。

给到 MATLAB 实际上是方程组,所以需要整理一下成为一个标准的 $Ax=b$ 方程组。

因此 MATLAB 代码:

function cowday=niuchicao_cowday(cowcountgiven_st,cowday_st,cowcountgiven_nd,cowday_nd,cowcount)
% cowcountgiven: 题目给出多少牛
% cowday: 题目给出分别吃多少天
% 牧场上有一片青草,每天都生长得一样快。这片青草供给10头牛吃,可以吃22天,或者供给16头牛吃,可以吃10天,期间一直有草生长。如果供给25头牛吃,可以吃多少天?
% cowday=niuchicao_cowday(10,22,16,10,25)

%s:草场原有草量
%speed_cow: 牛吃草的速度
% speed_cow*cowday_st*cowcountgiven_st=s+speed_grass*cowday_st
% speed_cow*cowday_nd*cowcountgiven_nd=s+speed_grass*cowday_nd
% speed_cow*cowday*cowcount=s+speed_grass*cowday
% Suppose speed_cow=1

A=[cowday_st,1;cowday_nd,1];b=[cowcountgiven_st*cowday_st;cowcountgiven_nd*cowday_nd];
x=A\b;speed_grass=x(1);s=x(2);
cowday=s/(cowcount-speed_grass);
end

反过来说,对于求牛的数目也一样,给出 MATLAB 代码:

function cowcount=niuchicao_cowcount(cowcountgiven_st,cowday_st,cowcountgiven_nd,cowday_nd,cowday)
% cowcountgiven: 题目给出多少牛
% cowday: 题目给出分别吃多少天
% 例如有一块牧场,可供9头牛吃3天,或者5头牛吃6天,请问多少牛能够2天吃完?
% cowcount=niuchicao_cowcount(9,3,5,6,2)

%s:草场原有草量
%speed_cow: 牛吃草的速度
% speed_cow*cowday_st*cowcountgiven_st=s+speed_grass*cowday_st
% speed_cow*cowday_nd*cowcountgiven_nd=s+speed_grass*cowday_nd
% speed_cow*cowday*cowcount=s+speed_grass*cowday
% Suppose speed_cow=1

A=[cowday_st,1;cowday_nd,1];b=[cowcountgiven_st*cowday_st;cowcountgiven_nd*cowday_nd];
x=A\b;speed_grass=x(1);s=x(2);
cowcount=speed_grass+s/cowday;
end

然后运行即可。

拓展:用 Python、R 编写相关程序。