@azazelija

Разработать алгоритм для уменьшения количества итераций с большими числами?

Добрый день. Имеет задача: найти через сколько дней числа на двух табло будут равны заданному коэффиценту. Но табло показывает только двузначные числа, если число больше 100 то она будет возвращать 99. Если какое-то из чисел до конца цикла обернется в ноль возвращается -1.
Проблема заключается в больших числах, так как при тестировании 100.000 пар чисел программа обрабатывает один запрос раз в полторы секунды.

Мой алгоритм (я возвращаю флоат так как стоит проблема с точностью при делении. Например 99 делить на 49 будет 2 :))
public static int countRelations(long x, long y, int k) {

        int days = 0;
        while (countDaysOnScoreboard(x)/countDaysOnScoreboard(y) != k
                && countDaysOnScoreboard(y)/countDaysOnScoreboard(x) != k) {
            days += 1;
            x--;
            y--;
            if (x == 0 || y == 0) {
                days = -1;
                break;
            }
        }
        return days;
    }

public static float countDaysOnScoreboard(long num) {
        if (num >= 100)
            return 99;
        return num;
    }


Код для тестирования:
@Test
    void countRelationsTest() throws IOException {
        assertEquals(0, Main.countRelations(2,1,2));
        assertEquals(98, Main.countRelations(100,99,2));
        assertEquals(-1, Main.countRelations(17,13,10));
        assertEquals(0, Main.countRelations(3,3,1));
        assertEquals(-1, Main.countRelations(1,1,2));

        BufferedReader reader = new BufferedReader(new FileReader("src/ДИТ КИБ (Остроумов)/02"));
        BufferedReader readerAnsw = new BufferedReader(new FileReader("src/ДИТ КИБ (Остроумов)/02.a"));
        String s;
        String sAnsw;
        int i = 0;
        while ((s = reader.readLine()) != null) {
            sAnsw = readerAnsw.readLine();
            String[] strArr = s.split(" ");
            assertEquals(Integer.parseInt(sAnsw), Main.countRelations(Integer.parseInt(strArr[0]),Integer.parseInt(strArr[1]),Integer.parseInt(strArr[2])));
            System.out.println("Test passed " + i++);
        }

    }


Также прилагаю два файла. Один с заданными парами и коэффицентом. Другой с ответами.
Пары
Ответы
  • Вопрос задан
  • 146 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы