C/C++

Деление пополам сириус с++ дам 65 баллов

Дано действительное число a
и натуральное n
. Вычислите корень n
-й степени из числа a
.

Для решения используйте метод деления отрезка пополам.

Входные данные

На вход программе в первой строке подаётся действительное неотрицательное число a
, не превосходящее 1000
, заданное с точностью до 6
знаков после точки. Во второй строке — натуральное число n
, не превосходящее 10
.

Выходные данные

Программа должна вывести единственное число — ответ на задачу с точностью не менее 4
знаков после точки.
"Математика не нужнааааа", - повторяли свою утреннюю мантру выпускники видеокурсов по C++ нестройными голосами. Их настроение было ужасным. Программы, сделанные по рецепту видеотренера, не работали. В резюме количество мест работы за 3 года превышало количество технологий, которыми они могли похвастаться, несмотря на солидные перерывы между работами. Их выгоняли отовсюду до истечения испытательного срока. Оставалась только мантра: "Математика не нужнаааа"...

Попробуйте этот вариант. В отличие от предыдущих, он работает и с основаниями, меньшими единицы. Функция pow не используется, и вообще заголовок cmath не подключён, так что преподаватель не скажет, что вы мухлевали. Корректно обрабатываются предельные случаи (n = 0) и ошибки входных данных (a < 0). Основание и показатель можно вводить в широких пределах, например, для основания 1 млрд и корня степени 1000 потребуется не более 50 итераций для вычисления корня, а для основания 10³⁰⁰ и показателя 1 млрд - чуть более 1000 итераций.
 #include 
#include
#include

using namespace std;

double intpow(double a, unsigned n) {
double p = 1.0;
while (n != 0) {
if (n % 2 == 1) p *= a;
a *= a;
n /= 2;
}
return p;
}

double recippow(double a, unsigned n) {
if (n == 0) return numeric_limits::infinity();
if (n == 1) return a;

const double EPS = 1e-6;
double lo = min(1.0, a), hi = max(a, 1.0);
while (hi - lo > EPS) {
const double med = (hi + lo) * 0.5;
const double p = intpow(med, n);
(p < a ? lo : hi) = med;
}
return lo;
}

int main() {
cout > a >> n;
if (a < 0.0)
cout
Юрий Золотарев
Юрий Золотарев
87 571
Лучший ответ
 #include  
#include

using namespace std;

int main() {
double a, L = 0, R, M, y;
int n;
const double EPS = 1e-6;

// ввод чисел a и n
cin >> a >> n;

// инициализация правой границы
R = a;

// поиск корня методом деления отрезка пополам
while (R - L > EPS) {
M = (L + R) / 2; // середина отрезка
y = pow(M, n); // возведение в степень
if (y < a) {
L = M;
} else {
R = M;
}
}

// вывод результата с точностью до 4 знаков после запятой
cout.precision(4);
cout
Юрий Золотарев Всё проще.
 cout							
Вот пример решения задачи на C++ с использованием метода деления отрезка пополам:
 #include   

#include

using namespace std;



double f(double x, double a, int n) {

return pow(x, n) - a; // функция, которую мы будем искать корень

}



double findRoot(double a, int n) {

double left = 0.0, right = a, mid;

const double EPS = 1e-7; // точность, с которой мы будем искать корень

while (right - left > EPS) {

mid = (left + right) / 2.0;

if (f(mid, a, n) > 0) { // корень находится слева от mid

right = mid;

} else { // корень находится справа от mid

left = mid;

}

}

return (left + right) / 2.0;

}



int main() {

double a;

int n;

cin >> a >> n;



double ans = findRoot(a, n);

printf("%.4f\n", ans);



return 0;

}



Мы начинаем с задания границ отрезка, на котором мы ищем корень. Левая граница равна 0, а правая граница равна a, так как корень n-й степени из a не может быть больше a. Затем мы запускаем цикл, который будет делить отрезок пополам и сравнивать значение функции f(x) с нулем. Если значение функции больше нуля, то корень находится слева от mid, и мы обновляем правую границу right. Если значение функции меньше или равно нулю, то корень находится справа от mid, и мы обновляем левую границу left. Мы продолжаем делить отрезок пополам до тех пор, пока разница между правой и левой границей не станет меньше определенной точности (EPS). Когда мы находим корень, мы возвращаем среднее значение границ left и right.
Женек Елисеев не работает на 4 тесте
Юрий Золотарев Использовать pow в задаче поиска корня методом половинного деления... м-да. Тогда надо было просто написать
 cout