Найдите такое
число x, что x2 + = C,
с точностью не менее 6 десятичных знаков.
Вход. Одно
вещественное число C (1.0 ≤ C ≤ 1010).
Выход. Выведите
искомый корень x с точностью не менее
6 десятичных знаков.
Пример
входа |
Пример
выхода |
18.0 |
4.000000 |
бинарный
поиск
Рассмотрим
функцию f(x) = x2 + . Очевидно, что
·
f(0) = 0;
·
f(C) = C2 + > C;
То есть корень
уравнения
f(x) = С
лежит на промежутке
[0; C]. Функция f(x) строго возрастающая. Ищем корень x бинарным поиском.
Пример
Рассмотрим график функции f(x) = x2 + . Можно заметить что
·
f(0) = 0 < C;
·
f() = C+ > C;
Следовательно корень
уравнения f(x) = С лежит на промежутке [0; ] и может быть найден бинарным
поиском.
Объявим
константу EPS и функцию f(x).
#define EPS 1e-10
double f(double
x)
{
return x * x
+ sqrt(x);
}
Основная часть
программы. Читаем значение С.
scanf("%lf",&c);
Устанавливаем границы бинарного поиска [left; right] = [0; C].
left = 0; right
= c;
Запускаем бинарный поиск.
while(right - left > EPS)
{
middle = (left + right)/ 2;
y = f(middle);
if (y > c)
right = middle; else left = middle;
}
Выводим ответ.
printf("%lf\n",left);
Java реализация
import java.util.*;
public class Main
{
static double f(double x)
{
return x * x + Math.sqrt(x);
}
public static void main(String[] args)
{
Scanner con = new
Scanner(System.in);
double c = con.nextDouble();
double left = 0, right = c;
while(right - left > 1e-10)
{
double middle = (left + right)/ 2;
double y = f(middle);
if (y > c) right = middle; else left = middle;
}
System.out.println(left);
con.close();
}
}