Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.04.2018
Сообщений: 28
1

Нахождение корня n-ой степени

30.08.2019, 19:35. Показов 817. Ответов 9
Метки нет (Все метки)

Задача про нахождение корня n-ой степени из числа а.
Метод - деление отрезка пополам, метод в других применяю, тут какой-то ступор....
Что не так?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
 
int main()
{
 
__double a,e=1e-7;
__int n;
__cin >> a;
__cin>> n;
__double y,x,x1=0,x2=a;
__while(true)
__{
____x=(x2+x1)/2;
____y=pow(x,n);
____if(fabs(y-a) > e)
______if(y-a>0) x2=x;
______else x1=x;
____else break;
__}
__cout << x;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2019, 19:35
Ответы с готовыми решениями:

Функция корня степени
Написать и протестировать функцию, которая по натуральному k и вещественным x &gt; 0, 0 &lt; ε...

Вычисление корня n-ой степени
Сам обучаюсь C#, но дали решить С++ не понимаю помогите пожалуйста!!!

Извлечение корня n-степени
Написал программу для вычисления корня n-cтепени #include&lt;iostream&gt; #include&lt;math.h&gt; using...

Рекурсия: вычисление корня n-ой степени
Вот условие А вот то, что я набросал... Прошу исправить... Зарание спасибо: #pragma argsused...

9
Модератор
Эксперт С++
10871 / 8990 / 5408
Регистрация: 18.12.2011
Сообщений: 24,030
30.08.2019, 19:40 2
Попробуйте такую функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
double Nth_root(double number, int power)
{
   double eps = 1e-1;
   double prev_y, next_y;
 
   next_y = number;
   do
   {
      prev_y = next_y;
      next_y = (prev_y*(power - 1) + number / pow(prev_y, power- 1))/power;
   }while (fabs(next_y - prev_y) > eps);
   return next_y;
}
int main()
{
    double a;
    int n;
    cin >> a;
    cin>> n;
    cout <<  Nth_root(a,n);
}
Источник Функция корня степени
0
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
30.08.2019, 19:43 3
Программа корректно отработает если a=-4, n=2 ?
0
0 / 0 / 0
Регистрация: 11.04.2018
Сообщений: 28
31.08.2019, 07:47  [ТС] 4
A от 0 до 1000

Добавлено через 6 минут
Вот это вариант с заменой pow и учетом чисел меньше 1, но не проходит тест 18 и 30 - это значит , что недостаточная точность ответа - т.е. при вводе а=2, n=2, ответ 1,41421, а должно быть 1.41421356237
Куда смотреть?

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

const double e= 1e-15;
double po(double x, int n){
__if (n == 1) return x;
__else{
____double now = x;
____for (int i = 0; i < n - 1; i++){
______now *= x;
____}
____return now;
__}
}

int main()
{
__double a;
__int n;
__cin >> a;
__cin>> n;
__double y,x,x1=0, x2=a * a;
__if (a==0) {cout << 0;}
__else if (n == 0) {cout << 1;}
__else if (n == 1) {cout << a;}
__else{
____if (a<1) x2=1;

____while (fabs(y-a) > e)
____{
______ x=(x2+x1)/2;
______ y=po(x,n);
______ if(y-a>0) x2=x;
______ else x1=x;
____}
____cout << x;
__}
}
0
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
31.08.2019, 08:39 5
C++
1
2
#include <iomanip>
cout<<setprecision(10)<<x;
p.s. научись оформлять тему с использованием тегов кода (смотри как в коде выше все красиво). Можно убрать эти прочерки вручную, если прога маленькая, а если строк 200 ?
0
0 / 0 / 0
Регистрация: 11.04.2018
Сообщений: 28
31.08.2019, 09:01  [ТС] 6
Спасибо. Может что-то недопонял, но теперь ответы все ОК, но говорит превышено время работы....
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
 
using namespace std;
 
const double e= 1e-15;
 
double po(double x, int n){
    if (n == 1) return x;
    else{
        double now = x;
        for (int i = 0; i < n - 1; i++){
            now *= x;
        }
        return now;
    }
}
 
int main()
{
  double a;
    int n;
    cin >> a;
    cin>> n;
    
    double y,x,x1=0, x2=a * a;
    if (a==0) {cout << 0;}
    else if (n == 0) {cout << 1;}
    else if (n == 1) {cout << a;}
    else{
        if (a<1) x2=1;
    
        while (fabs(y-a) > e)
        {
            x=(x2+x1)/2;
            y=po(x,n);
            if(y-a>0) x2=x;
            else x1=x;
        }
        cout<<setprecision(10)<<x; 
    }
}
[/CPP]
0
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
31.08.2019, 09:13 7
1. y=0 в main при инициализации
2. const double e = 1e-15 измените например на const double e = 1e-10

может поможет
0
0 / 0 / 0
Регистрация: 11.04.2018
Сообщений: 28
31.08.2019, 09:34  [ТС] 8
Выдает неправильный ответ на тест 30
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
 
using namespace std;
 
const double e= 1e-7;
 
double po(double x, int n){
    if (n == 1) return x;
    else{
        double now = x;
        for (int i = 0; i < n - 1; i++){
            now *= x;
        }
        return now;
    }
}
 
int main()
{
  double a;
    int n;
    cin >> a;
    cin>> n;
    
    double y=0,x,x1=0, x2=a;
    if (a==0) {cout << 0;}
    else if (n == 0) {cout << 1;}
    else if (n == 1) {cout << a;}
    else{
        if (a<1) x2=1;
    
        while (fabs(y-a) > e)
        {
            x=(x2+x1)/2;
            y=po(x,n);
            if(y-a>0) x2=x;
            else x1=x;
        }
        cout<<setprecision(10)<<x; 
    }
}
0
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
31.08.2019, 09:36 9
тест, что ли приведите ?
0
0 / 0 / 0
Регистрация: 11.04.2018
Сообщений: 28
31.08.2019, 09:47  [ТС] 10
Эта ошибка говорит вот о чем.
Вам просто не хватило точности.
Даже если бы хватило, задачу нельзя считать решенной правильно,
так как метод деления пополам реализован не во всех ветках.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2019, 09:47

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Вычисление корня заданной степени
Всем привет. Как сделать корень по основанию? Например:

Рекурсивное вычисление корня k-й степени
Описать рекурсивную функцию RootK(X, K, N) вещественного типа, находящую приближенное значение...

Извлечение корня н-ной степени из числа
Здравствуйте!!! Тут задачка такая: нужно извлечь корень н-ной степени из числа методом деления...

Вычисление корня n-й степени по итерационной формуле
Доброго времени суток, тут есть одна задача... Известно, что корень n-й степени из X может быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.