Форум программистов, компьютерный форум CyberForum.ru

n>=a в степени k - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
yardie
 Аватар для yardie
8 / 8 / 0
Регистрация: 14.07.2010
Сообщений: 166
30.08.2010, 20:08     n>=a в степени k #1
вот решил задачу таким образом:
задача:
Напишите программу, находящую для заданных числел n и k максимальное число a, такое, что ak≤ 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
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <cmath>
using namespace std;
 
void main()
{
double n,k,a,b;
cin >> n;
cin >>k;
 
for ( a=n-1; a; a--)
 
{
for(int i=1; i<k; i++)
 
a*=n;
 
}
 
if (n>=a)
 
{
 
cout << a;
 
break;
 
}
 
cin.get();
cin.get();
 
}
можно ли решить без заголовка <cmath>???
или максимально упростить программу?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2010, 20:08     n>=a в степени k
Посмотрите здесь:

C++ 3 во 2 степени .
Число в степени -1 C++
C++ Поднесение к степени
C++ Написать программу, вычисляющую X в степени Y и Y в степени X
C++ е в степени x
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 20:08     n>=a в степени k #21
silent_1991, нате методом Ньютона. Взято из sicp:
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
#include <iostream>
#include <cstdlib>
 
double abs(double x)
{
    return (x >= 0 ? x : -x);
}
 
double sqrt(double x, const double epsilon = 10e-6)
{
    if(x < 0)
    {
        std::cerr << "X must be positive" << std::endl;
        exit(EXIT_FAILURE);
    }
    if(!x)
        return 0;
    double guess = 1;
    while(abs(guess * guess - x) > epsilon)
        guess = (guess + x / guess) / 2.0;
    return guess;
}
 
int main()
{
    for(size_t i = 0; i < 20; ++i)
        std::cout << "sqrt(" << i << ") = " << sqrt(i) << std::endl;
    return EXIT_SUCCESS;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.09.2010, 20:10     n>=a в степени k #22
Nameless One,
Это квадратный корень... А в задаче требуется вычисление корня n-ой степени...
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 20:12     n>=a в степени k #23
silent_1991, пардон, ступил
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.09.2010, 00:46     n>=a в степени k #24
Вот программка для вычисления корней n-ой степени (n - целое) школьным методом... Точность, правда, не слишком велика (в среднем около 12-ти верных знаков), но, думаю, для решения поставленной задачи сойдёт...
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <stdio.h>
 
#define epsilon 0.00000000000001
 
double myabs(double A);
double myfact(int n);
double mypow(double a, int k);
double ex(double x);
 
double myabs(double A)
{
    return (A >= 0) ? A : -A;
}
 
double myfact(int n)
{
    double res = 1.0;
    int i;
 
    if (n == 0 || n == 1)
        return 1.0;
 
    for (i = 2; i <= n; i++)
        res *= i;
 
    return res;
}
 
double mypow(double a, int k)
{
    double b = 1;
    int i;
    
    for (i = 0; i < myabs((double)k); i++)
        b *= a;
    
    if (k < 0)
        return 1 / b;
 
    return b;
}
 
double ex(double x)
{
    double res = 1;
    double xn;
    int n = 1;
 
    do
    {
        xn = mypow(x, n) / myfact(n);
        res += xn;
        n++;
    }
    while (myabs(xn) > epsilon);
 
    return res;
}
 
double lnx(double x)
{
    double res = 0;
    double xn;
    double z = (1 - x) / (1 + x);
    int k;
    int n = 1;
 
    do
    {
        k = 2 * n - 1;
        xn = mypow(z, k) / k;
        res += xn;
        n++;
    }
    while (myabs(xn) >= 4.0 * epsilon);
 
    return -2.0 * res;
}
 
int myroot(double x, int y, double *res)
{
    double a, b, c;
 
    if (y == 0)
        return 1;
 
    if (y % 2 == 0 && x < 0)
        return 2;
 
    if (x == 0)
    {
        *res = 0.0;
        return 0;
    }
    
    if (x < 0)
    {
        *res = -ex(1 / (double)y * lnx(-x));
        return 0;
    }
    
    *res = ex(1 / (double)y * lnx(x));
    return 0;
}
 
int main()
{
    double x, y;
    double res;
    int err;
    
    while (1)
    {
        printf("Dlya vihoda nazhmite \"Ctrl + C\"\n");
        printf("Vvedite x: ");
        scanf("%lf", &x);
        printf("Vvedite y: ");
        scanf("%lf", &y);
 
        if ((err = myroot(x, y, &res)) == 1)
        {
            printf("y ne mozhet bit' raven 0!\n");
            continue;
        }
        else
        {
            if (err == 2)
            {
                printf("Pri vvedionnom y x ne mozhet bit' otricatel'nim!\n");
                continue;
            }
            else
            {
                printf("x ^ (1 / y) = %.10f\n", res);
                continue;
            }
        }
    }
    
    return 0;
}
Добавлено через 6 минут
Да... Скорось у него ужасная, корень 8 степени из 25876 вычислял несколько минут...

Добавлено через 1 минуту
Так вот я задался вопросом, какие алгоритмы используются в калькуляторах, системах компьютерной математики, да и в остальных подобных штуках для того же вычисления корня?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.09.2010, 01:11     n>=a в степени k #25
в первых калькуляторах использовалась формула приблизительных вычисленый, через дифференциал функции, а сейчас есть более точные методы но я о них пока что ничего не знаю))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2010, 02:43     n>=a в степени k
Еще ссылки по теме:

Написать программу, которая делит числа в 5 степени на число в 14 степени и выводит ответ в 5 степени. Найти ошибку C++
C++ Экспонента в степени
Три в степени k C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.09.2010, 02:43     n>=a в степени k #26
Скажем, Сишная pow спокойно справилась с корнем, который моя программа считает вот уже как 20 минут...

Добавлено через 1 минуту
Но я всё-таки думаю, что от разложения функций в ряды никуда не делись... Просто или ряды другие используют (с большей скоростью сходимости), или алгоритмы совершеннее...

Добавлено через 1 час 23 минуты
Ну я и идиот... А ещё вычмат на 5 сдал))) Как же я забыл-то про старину Ньютона)))

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
 
#define epsilon 0.000000000000001
 
double myabs(double a)
{
    return (a >= 0) ? a : -a;
}
 
double mypow(double x, int n)
{
    double y;
    int i;
    
    for (i = 0, y = 1; i < n; i++)
        y *= x;
 
    return y;
}
 
double myroot(double x, int n)
{
    double xk, xkplus1 = 1;
    int sign = 1;
    
    if (x < 0)
    {
        x *= -1;
        sign = -1;
    }
    
    do
    {
        xk = xkplus1;
        xkplus1 = xk - (mypow(xk, n) - x) / (n * mypow(xk, n - 1));
    }
    while (myabs(xk - xkplus1) > epsilon);
    
    return sign * xkplus1;
}
 
int main()
{
    double x;
    int n;
 
    while (1)
    {
        printf("Dlya vihoda nazhmite \"Ctrl + C\"\n");
        printf("Vvedite x: ");
        scanf("%lf", &x);
        printf("Vvedite n: ");
        scanf("%d", &n);
        
        if (n == 0)
        {
            printf("n ne mozhet bit' raven 0!\n");
            continue;
        }
        else
        {
            if (n % 2 == 0 && x < 0)
            {
                printf("Pri chyotnom n x ne mozhet bit' otricatel'nim!\n");
                continue;
            }
            else
            {
                printf("x ^ (1 / n) = %.12f\n", myroot(x, n));
                continue;
            }
        }
    }
 
    return 0;
}
Быстрое и точное решение. Достаточно было вспомнить, что корень из а энтой степени - это уравнение x^n - a = 0, корнем которого и является искомое число... И тут уж метод Ньютона в помощь...
Это лето на мыслительных способностях сказывается)))
Yandex
Объявления
02.09.2010, 02:43     n>=a в степени k
Ответ Создать тему
Опции темы

Текущее время: 21:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru