Добрый день. Имеет задача: найти через сколько дней числа на двух табло будут равны заданному коэффиценту. Но табло показывает только двузначные числа, если число больше 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++);
}
}
Также прилагаю два файла. Один с заданными парами и коэффицентом. Другой с ответами.
Пары
Ответы