8 / 7 / 3
Регистрация: 09.10.2014
Сообщений: 165

Возведение числа а в степень n

02.02.2016, 18:28. Показов 7425. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возведение числа а в степень n ,задача не проста чем , 1<=а<=10 | 1<=n<=7000
Степень может быть 7000 , и тут у меня возникли трудности , есть идеи ?
(обязательно использовать массив, функции нельзя)
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.02.2016, 18:28
Ответы с готовыми решениями:

Возведение из числа степень
Прошу помочь. Вводим любое число n и надо возвести её степень. (притом, должно быть или 2 в степени x, или 3) Например: n=81 &gt;&gt;...

Возведение числа в степень
Помогите написать программу, возводящщую число M в степень N (-10&lt;M&lt;10, 0&lt;N&lt;10 - проверить выполнение данных условий)

Возведение числа n в степень m.
Написать программу - возведение числа n в m-ю степень. Входные данные поступают с клавиатуры. Результат выводится на экран.

14
115 / 92 / 66
Регистрация: 27.04.2014
Сообщений: 307
02.02.2016, 19:01
C++
1
2
3
4
5
6
7
    int a = 3;
    long long s = 1;
    for(int i=0; i<7000; i++)
    {
        s *=a;
        cout << s;
    }
0
8 / 7 / 3
Регистрация: 09.10.2014
Сообщений: 165
02.02.2016, 19:16  [ТС]
а и n нужно вводить с клавиатуры
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
02.02.2016, 19:26
стандартными средствами только длинной арифметикой
1
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,228
Записей в блоге: 1
02.02.2016, 21:07
Цитата Сообщение от Difaust Посмотреть сообщение
int a = 3;
long long s = 1;
37000свыше 3300 знаков. Никакой long long (и даже double) не потянут.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5287 / 2375 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
02.02.2016, 21:22
DEVILD_Roma, boost::multiprecision Вам в помощь1.
_______________________
1 предвосхищая Ваши вопросы.
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
02.02.2016, 22:01
gru74ik, или гугле )
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
#include <bits/stdc++.h>
using namespace std;
int main() {
    const int base = 1e9;
    int x, n,b;
    cin >> x >> n;
    b = x;
    int carry = 0;
    vector<int> a;
    a.push_back(x);
    for (int j=1;j < n;j++) {
        for (size_t i = 0; i < a.size() || carry; ++i) {
            if (i == a.size())
                a.push_back(0);
            long long cur = carry + a[i] * 1ll * b;
            a[i] = int(cur % base);
            carry = int(cur / base);
        }
        while (a.size() > 1 && a.back() == 0)
            a.pop_back();
    }
    for (auto i : a)
        cout << i;
    return 0;
}
Добавлено через 2 минуты
только 10 в некоторых степенях не считает ,это автору пофиксить
0
Заблокирован
02.02.2016, 22:03
DEVILD_Roma, длинная арифметика имитация действий в столбик, если надо могу скинуть готовую библиотеку... но лучше самим сделать не так уж и сложно)
0
8 / 7 / 3
Регистрация: 09.10.2014
Сообщений: 165
05.02.2016, 18:04  [ТС]
Я думаю что нужно для начала поместить результат а ^ n куда-то (но если n=7000 врятли оно влезет куда-то )
для этого как то разбить при возведении на отдельные части...или к примеру узнать длину числа результата и N-е количество символов справа налево записывать в массив , и вывести потом все элементы массива , но опять таки размер массива будет непонятно каким...буду рад Вашим идеям,кодам,помощи..
0
8 / 7 / 3
Регистрация: 09.10.2014
Сообщений: 165
09.02.2016, 17:11  [ТС]
Уже делал тему но никто ничего не подсказал...
Возведение числа а в степень n ,задача не проста чем , 1<=а<=10 | 1<=n<=7000
Степень может быть 7000 .10^7000 это 1 и семь тысяч нулей(по условию а=9 , это максимум,из этого следует что размера массива в 7000 хватит чтобы поместить каждую цифру ответа в отдельные элемент массива)но куда поместить сам ответ я не знаю в double он не влезет , может через string ?Буду рад помощи.
(обязательно использовать массив, функции нельзя)
0
3 / 3 / 3
Регистрация: 04.02.2016
Сообщений: 22
09.02.2016, 19:49
Очень интересное задание. Вот мой вариант решения:
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
#include <iostream>
using namespace std;
 
int main(){
    int a, n, result[4000], cur, res;
    cout<<"Введите число> ";
    cin>>a;
    cout<<"Введите степень> ";
    cin>>n;
    if(a==10){
        result[0]=1;
        for(int i=1;i<=n;i++){
            result[i]=0;
        }
        cur=n+1;
    }
    if(a==1){
        result[0]=1;
        cur=1;
    }
    if(a<10){
        result[0]=a;
        cur=1;
        for(int i=0;i<(n-1);i++){
            res=a*result[cur-1];
            if(cur==1 && res>10){
                result[1]=res%10;
                result[0]=res/10;
                cur++;
            }
            else if(cur==1 && res<10)result[cur-1]=res;
            else{
                int memory=0;
                for(int j=(cur-1);j>=0;j--){
                    res=a*result[j]+memory;
                    if(res<10){
                        result[j]=res;
                        memory=0;
                    }
                    else{
                        if(j==0){
                            for(int k=cur;k>1;k--){
                                result[k]=result[k-1];
                            }
                            result[1]=res%10;
                            result[0]=res/10;
                            cur++;
                        }
                        else{
                            result[j]=res%10;
                            memory=res/10;
                        }
                    }
                }
            }
        }
    }
    cout<<"\nОтвет: ";
    for(int i=0;i<cur;i++)cout<<result[i];
    return 0;
}
Может не по максимуму оптимально, но зато все корректно и правильно

Добавлено через 27 минут
количество элементов в массиве правда нужно будет увеличить, если нужны будут выражения типа 9^7000
1
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
09.02.2016, 23:38
должен же кто-то бинарное возведение в степень рассказать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
long double stepen(long long a, long long b)
{
  if(b==0)return 1;
  long double ans = stepen(a,b/2);
  ans*=ans;
  if(b%2!=0) ans *= a;
  return ans;
}
 
int main()
{
  long long a,n;
  cin >> a >> n;
  long double ans = 1;
  ans = stepen(a,n);
  printf("%.0Lf", ans);
}
работает на 5^7000, ломается на 6^7000
так же теряется точность

остаётся заменить long double на массив\класс и реализовать * длинных чисел на длинное, стандартный алгоритм за квадрат от длины максимального из этих чисел, итого O(n^2) вроде
так же, если полениться и реализовать просто умножение длинного на короткое, что значительно проще, то будет O(n^2), при 7000 это займёт не больше 1ой секунды

почему бинарное возведение в степень не дало асимптотически лучший результат? или я неправильно посчитал?

сейчас реализую 2ое решение

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cin.sync_with_stdio(false);
    long long a,n;
    cin >> a >> n;
    int ans[10000];
    long long p=1;
    ans[0]=1;
    for(int i=0;i<n;i++)
    {
        long long tmp=0;
        for(int j=0;j<p;j++)
        {
            ans[j]*=a;
            ans[j]+=tmp;
            tmp=ans[j]/10;
            ans[j]%=10;
            if(j==p-1 && tmp!=0)p++;
        }
    }
    for(int i=p-1;i>=0;i--) cout << ans[i];
241 мс в режиме отладки при тесте 9 7000
1
8 / 7 / 3
Регистрация: 09.10.2014
Сообщений: 165
16.02.2016, 10:03  [ТС]
Цитата Сообщение от Krock21rus Посмотреть сообщение
241 мс в режиме отладки при тесте 9 7000
У Вас тоже правильное решение , но 9 в 7000 не досчитывает до правильного ответа (примерно 10-12 цифр у конце)
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
16.02.2016, 11:28
Цитата Сообщение от DEVILD_Roma Посмотреть сообщение
У Вас тоже правильное решение , но 9 в 7000 не досчитывает до правильного ответа (примерно 10-12 цифр у конце)
увы, всё верно
http://www.wolframalpha.com/input/?i=9^7000
если вы сравнивали со своим решением, то скорее всего у вас не верное
0
8 / 7 / 3
Регистрация: 09.10.2014
Сообщений: 165
16.02.2016, 15:56  [ТС]
Цитата Сообщение от Krock21rus Посмотреть сообщение
увы, всё верно
после удаления строчки : cin.sync_with_stdio(false);
ответ такой как и в моей программе и такой же как на сайте который Вы скинули выше
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2016, 15:56
Помогаю со студенческими работами здесь

Возведение числа в степень!
Хай всем кто на форуме! Помогите с задачей! Надо возвести число в степень #include &lt;iostream&gt; using namespace std; int...

Возведение числа в степень n-1
Есть формула {(-1)}^{n-1}*{3}^{n-1} , n увеличивается циклом на 1. Как записать числа в степень n-1 без пользов. и стандартных функций??...

Рекурсивное возведение в степень числа
Рекурсивная функция,которая принимает 2 параметра:первый-число,второй-степень в которую нужно возвести число.Всё просто.Но до моей тупой...

Возведение в степень вводимого числа
int _tmain() {float t, A; cin&gt;&gt;t&gt;&gt;A; float b=t+A; float a=pow(b,1.0/3.0); cout&lt;&lt;a; getch (); return 0; } Пытаюсь...

Возведение отрицательного числа в степень
Написал программу по нахождению суммы ряда с заданной точностью(условия ниже). Возникла проблема с возведением отрицательного числа. ...


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

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

Новые блоги и статьи
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
Вот в чем сила LM.
Hrethgir 02.07.2025
как на английском будет “обслуживание“ Слово «обслуживание» на английском языке может переводиться несколькими способами в зависимости от контекста: * **Service** — самый распространённый. . .
Использование Keycloak со Spring Boot и интеграция Identity Provider
Javaican 01.07.2025
Два года назад я получил задачу, которая сначала показалась тривиальной: интегрировать корпоративную аутентификацию в микросервисную архитектуру. На тот момент у нас было семь Spring Boot приложений,. . .
Содержание темы с примерами на WebGL
8Observer8 01.07.2025
Все примеры из книги Мацуды и Ли в песочнице JSFiddle Пример выводит точку красного цвета размером 10 пикселей на WebGL 1. 0 и 2. 0 WebGL 1. 0. Передача координаты точки из главной программы в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru