Расчет времени столкновения ремня - PullRequest
0 голосов
/ 02 мая 2018

г. Дис и мистер Астер - инженеры-механики на Fiasco Iron Works. Им было поручено проектировать дороги для автоматизированных тележек для перевозки железные руды на плавильных заводах. Они должны были сделать две кольцевые дороги для автоматизированных тележек. Однако по ошибке Мистер Дис и мистер Астер сделали кольцевые дороги касательными к каждому другой (то есть два круговых пути касаются друг друга в некоторой точке).
Каждое утро в 08:00 троллейбусы начинаются в точке касания и двигаться по часовой стрелке в их соответствующих треках. Это вполне очевидно что в какой-то момент тележки столкнутся в точке, откуда они начали. В отчаянной попытке спасти тележки и Ущерб, нанесенный работе завода, главный инженер завод попросил вас написать программу, которая будет звучать гудок за 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 голосов
/ 02 мая 2018

Другой альтернативный подход - рассчитать 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;
}
0 голосов
/ 02 мая 2018

Пояс, имеющий больший периметр, учитывается для расчета расстояния, которое он преодолевает до столкновения. Так что скорость не может быть выбрана произвольно, это должен быть ремень, имеющий больший периметр.

Изменения

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;
}
...