План курса / Все задачи / Алгоритмы и структуры данных
Поиск корня без деления
средне
# решено
Дано целое неотрицательное число x. Нужно вернуть квадратный корень из x, округленный вниз до ближайшего целого числа. Использование встроенных функций для вычисления корня запрещено.
Пример 1:
Ввод: x = 25
Вывод: 5
Пример 2:
Ввод: x = 7
Вывод: 2
Объяснение: корень из 7 это примерно 2.645... для ответа мы округляем вниз
Ограничения:
x >= 1
public class Solution
{
public static int FindSqrt(int x)
{
Func<long, bool> good = (long i) => i * i <= x;
// Note: работаем именно с целыми числами
// Если работать с не целыми, то получим неточный ответ
// из-за накапливающейся неточности во float
long left = 0;
long right = (long)x + 1;
while (right - left > 1)
{
long mid = (left + right) / 2;
if (good(mid))
{
left = mid;
}
else
{
right = mid;
}
}
return (int)left; // Возвращаем результат как int
}
}
using namespace std;
int findSqrt(int x) {
auto good = [&](long long int i) {
return i * i <= x;
};
// Note: работаем именно с целыми числами
// если работать с не целыми, то получим неточный ответ
// из-за накапливающейся неточности во float
long long int l = 0;
long long int r = static_cast<long long int>(x) + 1;
while (r - l > 1) {
long long int m = (l + r) / 2;
if (good(m)) {
l = m;
} else {
r = m;
}
}
return static_cast<int>(l);
}
package main
func findSqrt(x int) int {
// Note: работаем именно с целыми числами
// если работать с не целыми, то получим неточный ответ
// из-за накапливающейся неточности во float
l, r := 0, x+1
for r-l > 1 {
m := (l + r) / 2
if m*m <= x {
l = m
} else {
r = m
}
}
return l
}
public class Solution {
public int findSqrt(int x) {
// Note: работаем именно с целыми числами
// если работать с не целыми, то получим неточный ответ
// из-за накапливающейся неточности во float
int l = 0;
long r = (long) x + 1;
while (r - l > 1) {
long m = (l + r) / 2;
if (good(m, x)) {
l = (int) m;
} else {
r = m;
}
}
return l;
}
private boolean good(long i, int x) {
return i * i <= x;
}
}
from typing import *
def find_sqrt(x: int) -> int:
# Note: работаем именно с целыми числами
# если работать с не целыми, то получим неточный ответ
# из-за накапливающейся неточности во float
l, r = 0, x + 1
while r - l > 1:
m = (l + r) // 2
if m * m <= x:
l = m
else:
r = m
return l
export function findSqrt(x) {
// Note: работаем именно с целыми числами
// если работать с не целыми, то получим неточный ответ
// из-за накапливающейся неточности во float
let l = 0;
let r = x + 1;
while (r - l > 1) {
const m = Math.floor((l + r) / 2);
if (m * m <= x) {
l = m;
} else {
r = m;
}
}
return l;
}
Оценка сложности
Время: O(log(x)), где x - число, для которого ищем корень