现有一经典问题:
1. 001,002两辆火车相距100km,001的速度是100kpm,002的速度是120kpm,002追赶001.
一只小鸟的速度是160kpm,小鸟从002开始,在两辆火车之间往返,不记火车长度和小鸟掉头距离。
问单002追上001时,小鸟飞了多远路程?小鸟往返了多少趟?每趟个多长时间?*******
一北京大学数学系的回答道:
以001车为参照系,则002车相当于以20kpm速度追赶,
鸟以60kpms的速度在车之间飞。若以数学方式表达,
往返应为无限次(最后每次往返时间趋于零),
但所花时间共为两车从开始追赶到相遇的时间100/20=5小时,行程为160*5=900km。
以s(n)表示鸟第n次往返的开始时两车距离,以t(n)表示鸟第n次往返所花时间。
则s(0)=100,所求为t(n)。把鸟第n+1次往返的过程分为往和返,从而求出第n+1次往返所花时间:
往时,所花时间为s(n)/60;返时,两车距离已变为s(n) - (s(n)/60)*20,
故鸟再花 (s(n) - (s(n)/60)*20)/(40+20)时间飞到002车上。
从而鸟第n+1次往返共花s(n)/60 + (s(n) - (s(n)/60)*20)/(40+20)时间。
即t(n+1) = s(n)/60 + (s(n) - (s(n)/60)*20)/(40+20) = s(n)/36。
且s(n+1) = s(n) - t(n+1)*20 = 5s(n)/9
由上两式,知t(n+2)=5t(n+1)/9(n=1,2,...),且t(1)=s(0)/36=100/36。2.下鸟要在有限的时间内往返无数次,不可能。不能求出小鸟往返的次数和每次的时间。
现把问题加一个条件,小鸟掉头的时间为0.5S。
问小鸟往返了多少趟?每趟个多长时间?****
请各位大侠有钱的出钱,给出问题解答思路和Java Code,没钱的顶一下。
在下最多只能发100分的贴,请不要嫌少。
1. 001,002两辆火车相距100km,001的速度是100kpm,002的速度是120kpm,002追赶001.
一只小鸟的速度是160kpm,小鸟从002开始,在两辆火车之间往返,不记火车长度和小鸟掉头距离。
问单002追上001时,小鸟飞了多远路程?小鸟往返了多少趟?每趟个多长时间?*******
一北京大学数学系的回答道:
以001车为参照系,则002车相当于以20kpm速度追赶,
鸟以60kpms的速度在车之间飞。若以数学方式表达,
往返应为无限次(最后每次往返时间趋于零),
但所花时间共为两车从开始追赶到相遇的时间100/20=5小时,行程为160*5=900km。
以s(n)表示鸟第n次往返的开始时两车距离,以t(n)表示鸟第n次往返所花时间。
则s(0)=100,所求为t(n)。把鸟第n+1次往返的过程分为往和返,从而求出第n+1次往返所花时间:
往时,所花时间为s(n)/60;返时,两车距离已变为s(n) - (s(n)/60)*20,
故鸟再花 (s(n) - (s(n)/60)*20)/(40+20)时间飞到002车上。
从而鸟第n+1次往返共花s(n)/60 + (s(n) - (s(n)/60)*20)/(40+20)时间。
即t(n+1) = s(n)/60 + (s(n) - (s(n)/60)*20)/(40+20) = s(n)/36。
且s(n+1) = s(n) - t(n+1)*20 = 5s(n)/9
由上两式,知t(n+2)=5t(n+1)/9(n=1,2,...),且t(1)=s(0)/36=100/36。2.下鸟要在有限的时间内往返无数次,不可能。不能求出小鸟往返的次数和每次的时间。
现把问题加一个条件,小鸟掉头的时间为0.5S。
问小鸟往返了多少趟?每趟个多长时间?****
请各位大侠有钱的出钱,给出问题解答思路和Java Code,没钱的顶一下。
在下最多只能发100分的贴,请不要嫌少。
while (distance > 0) {
double relativeSpeed = isFlyTo001?(birdSpeed - Car001Speed):(birdSpeed + Car002Speed);
double time = distance / relativeSpeed;
totaltime += time;
distance -= (Car001Speed - Car002Speed) * (time + birdPing);
}
应该就是这个样子的吧=。=没有测试
以002火车为参照物,001火车以20kpm的速度向我方前行。
小鸟以40kpm的速度向001火车飞去,
然后,停留0.5S,以280kpm的速度向我方飞回,
再停留0.5S,如此反复。
*
* 该类创建于 2009-7-19 下午08:40:28
* @version 1.0.0
* @author 9sky
*/
public class Main { private static final int TranSpeed=20;
private static final int BirdSpeedA=40;
private static final int BirdSpeedB=280;
private static final float StayTime = 0.5f;
private static float distance=100f;
private static float birdTrace=0f;
private static float birdTime=0f;
private static int count =0;
private static ArrayList<TraceElement> trace = new ArrayList<TraceElement>();
static class TraceElement{
String direct;
float pastTime;
}
public static boolean birdStay(){
distance-=TranSpeed*StayTime;
if(distance<0)return false;
birdTime+=StayTime;
return true;
}
public static boolean fly2A(){
float t = distance/(BirdSpeedA+TranSpeed);
distance-=TranSpeed*t;
if(distance<0)return false;
birdTime+=t;
birdTrace+=BirdSpeedA*t;
TraceElement e = new TraceElement();
e.direct="to 001";e.pastTime=t;
trace.add(e);
return true;
}
public static boolean fly2B(){
float t = distance/BirdSpeedB;
float dis=distance;
distance-=TranSpeed*t;
if(distance<0)return false;
birdTime+=t;
birdTrace+=dis;
TraceElement e = new TraceElement();
e.direct="to 002";e.pastTime=t;
trace.add(e);
return true;
}
public static void trace(){
boolean flag = true;
count =0;
trace.clear();
while(flag){
flag = fly2A();
if(!flag)break;
flag = birdStay();
if(!flag)break;
flag = fly2B();
if(!flag)break;
flag = birdStay();
count++;
}
} public static void printTrace(){
if(count==0)System.out.println("please call trace function first.");
for(TraceElement e:trace){
System.out.println(e.direct+'\t'+e.pastTime);
}
}
public static void main(String[] args) {
trace();
printTrace();
}}
public static void main(String[] args){
System.out.println("Times direction time distance");
fly(100,1,1);
}
/*用递归现实。
*@param distance 表示两列火车之间的距离
*@param direction 表示小鸟的飞行方向,值为1表示从002向001飞,2表示从001向002飞
*@param count 表示往返的次数。
*
*/
public static void fly(double distance,int direction,int count){
if(distance<=0) return ;
double timeTaken;
if(direction==1){
timeTaken=distance/60;
distance-=(timeTaken+0.5/3600)*20;
System.out.println("No."+count+" 2--->1 "+timeTaken+" "+distance);
if(distance<=0) return ;
fly(distance,2,count+1);
}else{
timeTaken=distance/280;
distance-=(timeTaken+0.5/3600)*20;
System.out.println("No."+count+" 1--->2 "+timeTaken+" "+distance);
if(distance<=0) return ;
fly(distance,1,count+1);
}
}
}Times direction time distance
No.1 2--->1 1.6666666666666667 66.66388888888889
No.2 1--->2 0.23808531746031747 61.89940476190476
No.3 2--->1 1.031656746031746 41.263492063492066
No.4 1--->2 0.14736961451247166 38.313321995464854
No.5 2--->1 0.6385553665910809 25.539436885865456
No.6 1--->2 0.09121227459237663 23.712413616240145
No.7 2--->1 0.3952068936040024 15.805497966382319
No.8 1--->2 0.056448207022793996 14.673756048148661
No.9 2--->1 0.2445626008024777 9.779726254321329
No.10 1--->2 0.034927593765433314 9.078396601234884
No.11 2--->1 0.1513066100205814 6.049486623045478
No.12 1--->2 0.021605309368019566 5.614602657907309
No.13 2--->1 0.09357671096512181 3.740290660827095
No.14 1--->2 0.01335818093152534 3.4703492644188105
No.15 2--->1 0.057839154406980176 2.3107883985014293
No.16 1--->2 0.008252815708933676 2.142954306544978
No.17 2--->1 0.035715905109082964 1.4258584265855407
No.18 1--->2 0.0050923515235197885 1.3212336183373672
No.19 2--->1 0.022020560305622786 0.8780446344471337
No.20 1--->2 0.003135873694454049 0.8125493827802749
No.21 2--->1 0.013542489713004582 0.5389218107424054
No.22 1--->2 0.0019247207526514479 0.4976496179115987
No.23 2--->1 0.008294160298526644 0.32898863416328805
No.24 1--->2 0.0011749594077260287 0.3027116682309897
No.25 2--->1 0.005045194470516495 0.19903000104288204
No.26 1--->2 7.108214322960073E-4 0.18203579461918412
No.27 2--->1 0.0030339299103197353 0.11857941863501163
No.28 1--->2 4.234979236964701E-4 0.10733168238330446
No.29 2--->1 0.0017888613730550743 0.06877667714442519
No.30 1--->2 2.456309898015185E-4 0.06108627957061704
No.31 2--->1 0.001018104659510284 0.03794640860263358
No.32 1--->2 1.3552288786654852E-4 0.03245817306752483
No.33 2--->1 5.409695511254138E-4 0.018861004267238777
No.34 1--->2 6.736072952585278E-5 0.014736011898943944
No.35 2--->1 2.456001983157324E-4 0.007046230154851519
No.36 1--->2 2.5165107695898285E-5 0.0037651502231557756
No.37 2--->1 6.275250371926293E-5 -2.676776290072608E-4F:\java>实数运算有精确度的损失。本题中精确的损失有累积的效果。
上面结果中的距离是飞到目标火车并停0.5秒后两火车之间的距离。