Блог пользователя OnlyVim

Автор OnlyVim, 9 лет назад, По-русски

Доброй ночи/рассвета/утра/дня/заката/вечера/ночи, Codeforces! Сегодня я заметил, что у меня задача С в Educational Codeforces Round 42 не прошла из-за теста 12334567891. Проверив свою программу я понял, что проблема была в проверке числа на квадрат, а именно if (sqrt(n) * sqrt(n) == n) это проверку я заменил на if (int(sqrt(n)) == sqrt(n)) и оно прошло все тесты. Можете сказать почему первая проверка не есть правильной.

Моё решение: http://codeforces.me/contest/962/submission/37171806

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

»
9 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится

Обе проверки плохие, но во второй просто получаем погрешность в вычислении sqrt(n) и ничего с этим не делаем, а в первой мы ее делаем еще и в два раза больше из-за умножения.

»
9 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Все стандартные функции процессора (в том числе и sqrt) имеют точность 10^(-14), чего более чем хватает для чисел до миллиарда.