皮带碰撞时间计算

时间:2018-05-02 05:51:08

标签: java algorithm numbers lcm

  

先生。 Dis和Aster先生是Fiasco Iron Works的机械工程师。   他们被指派设计自动手推车的道路   冶炼厂的铁矿石。他们应该做   两个用于自动手推车的圆形道路。但是,错误的   迪斯先生和阿斯特先生使圆形道路与每个道路相切   其他(即两个圆形路径在某一点上相互接触)   每天早上8点,手推车都从相切点开始   并在各自的轨道中顺时针移动。这很明显   在某些时候,手推车会在哪里碰撞   他们开始了。在绝望的尝试,以节省手推车和   对工厂运营造成的损害,总工程师   工厂要求你写一个听起来像的程序   在碰撞前10秒发出警报,以便工头可以停下来   手推车是为了避免碰撞。写一个程序   找出在警报器应该关闭之前经过的时间(以秒为单位)。

public static int timeLapsed(int perimeter1, int speed1, int perimeter2, int speed2) {
    int greater,smaller;
    int result = 0;
    if(perimeter1 >  perimeter2)    {
        greater = perimeter1;
        smaller = perimeter2;
    }   else    {
        greater = perimeter2;
        smaller = perimeter1;
    }
    for(int i=1;i<=smaller;i++)     {
        if(((greater*i)%smaller)==0)    {
            result = greater*i;
            break;
        }
    }

    return result/speed1-10;
}

在这里,我试图计算碰撞前的距离,这基本上是LCM操作然后按速度划分。但是对于某些案例来说这是失败的。请帮助我理解原因。

2 个答案:

答案 0 :(得分:0)

具有更大周长的皮带被考虑用于计算碰撞前它所覆盖的距离。因此速度不能任意选择,应该是带周长较大的带。

更改

public static int timeLapsed(int perimeter1, int speed1, int perimeter2, int speed2) {
    int greater,smaller;
    int speed, result = 0;
    if(perimeter1 >  perimeter2)    {
        greater = perimeter1;
        smaller = perimeter2;
        speed = speed1;
    }   else    {
        greater = perimeter2;
        smaller = perimeter1;
        speed = speed2;
    }
    for(int i=1;i<=smaller;i++)     {
        if(((greater*i)%smaller)==0)    {
            result = greater*i;
            break;
        }
    }

    return result/speed-10;
}

答案 1 :(得分:0)

另一种替代方法,计算两个皮带所用时间的LCM,即碰撞时间。

    public static int timeLapsed(int perimeter1, int speed1, int perimeter2, int speed2) {
    int timeForTrolley1 = perimeter1/speed1,timeForTrolley2 = perimeter2/speed2;
    int greater,smaller;
    int result = 0;
    if(timeForTrolley1 >  timeForTrolley2)  {
        greater = timeForTrolley1;
        smaller = timeForTrolley2;
    }   else    {
        greater = timeForTrolley2;
        smaller = timeForTrolley1;
    }
    for(int i=1;i<=smaller;i++)     {
        if(((greater*i)%smaller)==0)    {
            result = greater*i;
            break;
        }
    }

    return result-10;
}