论文部分内容阅读
有一道蜗牛爬墙的趣味数学题,题目中只有蜗牛上墙一段,笔者增加了其难度,又加上了蜗牛下墙一段。题目内容为:有一堵高10米的玻璃墙。一只蜗牛爬呀爬,一天爬5米,夜晚休息,第二天醒来却发现自己滑下去了3米。需要多长时间蜗牛才能从另一面爬下这堵光滑的玻璃墙?
问题分析
蜗牛的爬行速度是不变的,是5米,但夜晚休息时会下滑3米,这是本题的关键所在。因此,我们把问题分三个阶段,即上墙、下墙和骑墙。
1.上墙时:一天爬5米,又滑下去3米,得到的结果是爬上2米。但是,算法的关键是要看上墙的最后5米,蜗牛是否下滑。即看是否符合骑墙的条件,如符合,将不倒退,如不符合则倒退,直至骑墙为止。
2.骑墙时:骑墙是个转折状态,因而没有路程,也就没有时间。
3.下墙时:一天爬行5米,夜晚休息滑下3米,则全天爬行了8米。算法的关键是看是否符合下墙条件,如符合,则将休息时间内的下滑计入爬行里程,直至到达地面为止。
依上述思路计算时却出现了另一个问题:有小数的出现使计算不精确,而且时间以一天为单位显得过长,不利于我们编程。因此,我们将原题稍作了变换。将原题中的每米放大为60个单位,同时将时间以小时计算,则题目可叙述为:有一堵高600单位的玻璃墙。一只蜗牛爬呀爬,一天(12小时)爬300单位(25单位/小时),夜晚(12小时)休息,第二天醒来却发现自己滑下去了180单位(15单位/小时)。需要多长时间蜗牛才能从另一面爬下这堵光滑的玻璃墙?
算法:蜗牛爬墙的结束可通过路程来控制,路程全长是600×2=
1200,如果达不到全程,要继续爬墙,程序继续执行。而600是个分界点,小于600,是向上爬(其中前300单位休息时有倒退);大于600,是往下爬(休息时也往下爬);等于600时,如果恰在此时休息,还需考虑休息时不走这种状态。时间以一天24小时计算,第一个12小时爬,第二个12小时(夜晚)休息,第三个12小时爬,第四个12小时休息……
源程序
运用高中信息技术第四册里的Pascal语言来编程。其程序代码为:
Programwnpq;
Vars,t,sk:integer{s代表路程,t代表时间,sk用来控制休息和爬行时间,即:1~12小时爬行,13~25小时休息。}
vardqboolen{dq代表骑墙}
begin
s:=o;
t:=0;
sk:=0;
dq:=false;
whiles<1200do
begin
t:=t+!;
if(t>=1000)
break;
sk:=sk+1;
if(sk>24)
begin
sk:=1;
end;
if(s<=600){以下是上墙阶段}
begin
if(sk<=12)
begin
s:=s+5;
end;
else
begin
s:=s-3;
end;
if(s=600)
begin
s:=s;
dq:=true;{表示到达墙顶}
sk:=1;{时间控制返回初期状态}
end;
else{以下为下墙阶段}
begin
If(sk<=12)
begin
s:=s+5;
end;
else
begin
s:=s+3;
end;
end;
If(dq=true){正好晚上骑墙}
begin
t:=t+12;
end;
end;
write(“蜗牛爬墙时间为:”t);
writeln(“小时”);
writeln(“即天数为:”t/24);
end
仔细研读问题,找出算法思路,即找出条件。如果条件不充分,要学会有依据地补充条件,甚至在不改变题目原意的基础上,适当转换条件,以实现精确计算。本文以蜗牛爬墙问题为例抛砖引玉,希望大家在遇到类似问题时能迎刃而解。
问题分析
蜗牛的爬行速度是不变的,是5米,但夜晚休息时会下滑3米,这是本题的关键所在。因此,我们把问题分三个阶段,即上墙、下墙和骑墙。
1.上墙时:一天爬5米,又滑下去3米,得到的结果是爬上2米。但是,算法的关键是要看上墙的最后5米,蜗牛是否下滑。即看是否符合骑墙的条件,如符合,将不倒退,如不符合则倒退,直至骑墙为止。
2.骑墙时:骑墙是个转折状态,因而没有路程,也就没有时间。
3.下墙时:一天爬行5米,夜晚休息滑下3米,则全天爬行了8米。算法的关键是看是否符合下墙条件,如符合,则将休息时间内的下滑计入爬行里程,直至到达地面为止。
依上述思路计算时却出现了另一个问题:有小数的出现使计算不精确,而且时间以一天为单位显得过长,不利于我们编程。因此,我们将原题稍作了变换。将原题中的每米放大为60个单位,同时将时间以小时计算,则题目可叙述为:有一堵高600单位的玻璃墙。一只蜗牛爬呀爬,一天(12小时)爬300单位(25单位/小时),夜晚(12小时)休息,第二天醒来却发现自己滑下去了180单位(15单位/小时)。需要多长时间蜗牛才能从另一面爬下这堵光滑的玻璃墙?
算法:蜗牛爬墙的结束可通过路程来控制,路程全长是600×2=
1200,如果达不到全程,要继续爬墙,程序继续执行。而600是个分界点,小于600,是向上爬(其中前300单位休息时有倒退);大于600,是往下爬(休息时也往下爬);等于600时,如果恰在此时休息,还需考虑休息时不走这种状态。时间以一天24小时计算,第一个12小时爬,第二个12小时(夜晚)休息,第三个12小时爬,第四个12小时休息……
源程序
运用高中信息技术第四册里的Pascal语言来编程。其程序代码为:
Programwnpq;
Vars,t,sk:integer{s代表路程,t代表时间,sk用来控制休息和爬行时间,即:1~12小时爬行,13~25小时休息。}
vardqboolen{dq代表骑墙}
begin
s:=o;
t:=0;
sk:=0;
dq:=false;
whiles<1200do
begin
t:=t+!;
if(t>=1000)
break;
sk:=sk+1;
if(sk>24)
begin
sk:=1;
end;
if(s<=600){以下是上墙阶段}
begin
if(sk<=12)
begin
s:=s+5;
end;
else
begin
s:=s-3;
end;
if(s=600)
begin
s:=s;
dq:=true;{表示到达墙顶}
sk:=1;{时间控制返回初期状态}
end;
else{以下为下墙阶段}
begin
If(sk<=12)
begin
s:=s+5;
end;
else
begin
s:=s+3;
end;
end;
If(dq=true){正好晚上骑墙}
begin
t:=t+12;
end;
end;
write(“蜗牛爬墙时间为:”t);
writeln(“小时”);
writeln(“即天数为:”t/24);
end
仔细研读问题,找出算法思路,即找出条件。如果条件不充分,要学会有依据地补充条件,甚至在不改变题目原意的基础上,适当转换条件,以实现精确计算。本文以蜗牛爬墙问题为例抛砖引玉,希望大家在遇到类似问题时能迎刃而解。