Дано действительное число a
и натуральное n
. Вычислите корень n
-й степени из числа a
.
Для решения используйте метод деления отрезка пополам.
Входные данные
На вход программе в первой строке подаётся действительное неотрицательное число a
, не превосходящее 1000
, заданное с точностью до 6
знаков после точки. Во второй строке — натуральное число n
, не превосходящее 10
.
Выходные данные
Программа должна вывести единственное число — ответ на задачу с точностью не менее 4
знаков после точки.
C/C++
Деление пополам сириус с++ дам 65 баллов
"Математика не нужнааааа", - повторяли свою утреннюю мантру выпускники видеокурсов по C++ нестройными голосами. Их настроение было ужасным. Программы, сделанные по рецепту видеотренера, не работали. В резюме количество мест работы за 3 года превышало количество технологий, которыми они могли похвастаться, несмотря на солидные перерывы между работами. Их выгоняли отовсюду до истечения испытательного срока. Оставалась только мантра: "Математика не нужнаааа"...
Попробуйте этот вариант. В отличие от предыдущих, он работает и с основаниями, меньшими единицы. Функция pow не используется, и вообще заголовок cmath не подключён, так что преподаватель не скажет, что вы мухлевали. Корректно обрабатываются предельные случаи (n = 0) и ошибки входных данных (a < 0). Основание и показатель можно вводить в широких пределах, например, для основания 1 млрд и корня степени 1000 потребуется не более 50 итераций для вычисления корня, а для основания 10³⁰⁰ и показателя 1 млрд - чуть более 1000 итераций.
Попробуйте этот вариант. В отличие от предыдущих, он работает и с основаниями, меньшими единицы. Функция 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
#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
Юрий Золотарев
Всё проще.
Вот пример решения задачи на C++ с использованием метода деления отрезка пополам:
Мы начинаем с задания границ отрезка, на котором мы ищем корень. Левая граница равна 0, а правая граница равна a, так как корень n-й степени из a не может быть больше a. Затем мы запускаем цикл, который будет делить отрезок пополам и сравнивать значение функции f(x) с нулем. Если значение функции больше нуля, то корень находится слева от mid, и мы обновляем правую границу right. Если значение функции меньше или равно нулю, то корень находится справа от mid, и мы обновляем левую границу left. Мы продолжаем делить отрезок пополам до тех пор, пока разница между правой и левой границей не станет меньше определенной точности (EPS). Когда мы находим корень, мы возвращаем среднее значение границ left и right.
#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
Похожие вопросы
- C++: Средний балл успеваемости каждого студента и средний балл всей группы отдельно по каждой дисциплине.
- Написать на C++. Сириус курсы
- С++ СИРИУС КУРСЫ ОТВЕТЬТЕ ПЖ ПОЛНЫМ КОДОМ
- C++ тестирование сириус задача8
- С++ Помогите сделать сириус!
- С++ сириус Номер числа Фибоначчи
- Задача C++ на Сириусе
- ПОМОГИТЕ ПОЖАЛУЙСТА!! ОЛИМПИАДА!! ИНФОРМАТИКА!!! 20 БАЛЛОВ В ПОДАРОК!!
- C++ неправильный остаток от деления
- Сколько раз нужно взять остаток от деления числа на кол-во единиц в его двоичном представлении, чтобы получить 0