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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
yardie
9 / 9 / 0
Регистрация: 14.07.2010
Сообщений: 166
#1

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

30.08.2010, 20:08. Просмотров 1460. Ответов 25
Метки нет (Все метки)

вот решил задачу таким образом:
задача:
Напишите программу, находящую для заданных числел 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>???
или максимально упростить программу?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2010, 20:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос n>=a в степени k (C++):

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

Написать рекурсивную функцию для расчета степени а в степени х, х - любое число - C++
Здравствуйте. Написать рекурсивную функцию для расчета степени а в степени х, х - любое число Нужна помощь с написанием вызова...

Написать программу, вычисляющую X в степени Y и Y в степени X - C++
Написать программу, вычисляющую X в степени Y и Y в степени X. Основная программа запрашивает X и Y и передает их в функцию. Функция...

3 во 2 степени . - C++
Чет решить не могу затык .. ошибка . #include &lt;iostream&gt; using namespace std; void main () { setlocale( LC_ALL,&quot;Russian&quot; ); ...

е в степени x - C++
я пытаюсь написать программу для вычисления е в степени x используя формулу изложенную ниже + нужно задавать количество цифр после точки ...

Цифра в степени - C++
Нужна помощь в создании программы которая найдет цифру в заданной степени без pow(). Я запутался создавая эту программу через циклы....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
31.08.2010, 22:51 #16
luk4196,
Гляньте мою функцию в предыдущем сообщении - степень вычисляется точно так же.
Только вопрос, какой результат выдаст ваша программа при входных данных x = 5, y = 0?
0
Nameless One
01.09.2010, 12:28
  #17

Не по теме:

Так задачу уже решили что-ли? А то что-то от ТС ничего не слышно...

0
Rajd
44 / 22 / 1
Регистрация: 20.11.2008
Сообщений: 178
01.09.2010, 14:02 #18
А теперь вопрос на засыпку. У автора точно не указан тип вводимых чисел, однако в программе стоит тип double, А почему тогда а вычисляется лишь как целое?

исходя из типа double и условия a^k≤ n . Что нужно добавить в программу чтобы её решить?
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
01.09.2010, 14:07 #19
Rajd, я думаю, вот этот пост - наиболее верное решение данной задачи для действительных чисел
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.09.2010, 19:35 #20
Nameless One,
Но поскольку автор просил не использовать математическую библиотеку, придётся писать собственную функцию для вычисления корня...
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
01.09.2010, 20:08 #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;
}
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.09.2010, 20:10 #22
Nameless One,
Это квадратный корень... А в задаче требуется вычисление корня n-ой степени...
1
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
01.09.2010, 20:12 #23
silent_1991, пардон, ступил
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
02.09.2010, 00:46 #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 минуту
Так вот я задался вопросом, какие алгоритмы используются в калькуляторах, системах компьютерной математики, да и в остальных подобных штуках для того же вычисления корня?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.09.2010, 01:11 #25
в первых калькуляторах использовалась формула приблизительных вычисленый, через дифференциал функции, а сейчас есть более точные методы но я о них пока что ничего не знаю))
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
02.09.2010, 02:43 #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, корнем которого и является искомое число... И тут уж метод Ньютона в помощь...
Это лето на мыслительных способностях сказывается)))
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2010, 02:43
Привет! Вот еще темы с ответами:

Число в степени -1 - C++
Подскажите, как выразить выражение (a+b) в -1 степени. P.S. 1/(a+b) не катит ;)

вычисление степени - C++
Здрасьте! Помогите плиз!!! Нужно: вычислить a в степени (n) , если (n&gt;0). Люди добрые хелп плиз!!!!!

Рассчитать степени - C++
Рассчитайте 101, 102, 103,..., 1020. Выведите условия и результат на экран. Помогите, пожалуйста! Мне срочно!

Вычислить А в степени n - C++
Дан массив размером n×n, элементы которого целые числа.Вычислить А^n, где n – натуральное число


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.09.2010, 02:43
Ответ Создать тему
Опции темы

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