现有一经典问题:
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.   

    boolean isFlyTo001 = true;
    while (distance > 0) {
      double relativeSpeed = isFlyTo001?(birdSpeed - Car001Speed):(birdSpeed + Car002Speed);
      double time = distance / relativeSpeed;
      totaltime += time;
      distance -=  (Car001Speed - Car002Speed) * (time + birdPing);
    }
    应该就是这个样子的吧=。=没有测试
      

  2.   

    import java.util.ArrayList;/**
      以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();
    }}
      

  3.   

    public class BirdAndTrain{
    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秒后两火车之间的距离。