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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.60
Gae4ka_1
3 / 3 / 0
Регистрация: 19.10.2009
Сообщений: 28
#1

Вычисление 2^n, где n<=10000 - C++

24.10.2009, 16:26. Просмотров 2600. Ответов 18
Метки нет (Все метки)

Всем привет!
У меня такое задание:
Написать програму на С которая вычистяет 2 в степени n, при чем n <=10 000 и n натеральное!

Зарание спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2009, 16:26     Вычисление 2^n, где n<=10000
Посмотрите здесь:

Вычисление НОД. не могу понять где ошибка. C++
Найти дружественные числа, принадлежащие отрезку [1; 10000] C++
Найти натуральное число от 1 до 10000 с максимальной суммой делителей. C++
Пользователь вводит с клавиатуры натуральное число меньшее 10000 C++
Дано Натуральное число N(N<10000) C++
Создание массива из 10000 не повторяющихся строк C++
C++ простые числа от 1 до 10000
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
24.10.2009, 16:32     Вычисление 2^n, где n<=10000 #2
тебе необходимо использовать длинную арифметику
заводишь массив char* на примерно 10 000 элементов и с помощь цикла считаешь, вычисление по времени выйдет около 1 сек без этого никак ибо самое большое число это 2 в 64 степени
Gae4ka_1
3 / 3 / 0
Регистрация: 19.10.2009
Сообщений: 28
24.10.2009, 17:12  [ТС]     Вычисление 2^n, где n<=10000 #3
я понимаю... но если можно ссылку с примером...
selevit
79 / 75 / 3
Регистрация: 08.10.2008
Сообщений: 296
24.10.2009, 21:31     Вычисление 2^n, где n<=10000 #4
В си как таковой логической функции вычисления степени не существует, но можно использовать основное логарифмическое тождество:

a^n на си выглядит так

C++
1
exp(a*log(n));
при этом нужно обязательно подключить библиотеку math.h

Добавлено через 1 час 58 минут
Цитата Сообщение от Gae4ka_1 Посмотреть сообщение
Всем привет!
У меня такое задание:
Написать програму на С которая вычистяет 2 в степени n, при чем n <=10 000 и n натеральное!

Зарание спасибо!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
setlocale(LC_ALL, "Russian");
int n;
cout<<"Введите значение показателя степени для основания 2: ";
cin>>n;
while(n>10000)
{
cout<<"Значение показателя степени не должно превышать 10000"<<endl;
cout<<"Введите значение показателя степени для основания 2: ";
cin>>n;
}
double a = exp(n*log(double(2)));
cout<<"Значение 2 в степени "<<n<<" = "<<a<<""<<endl;
}
Добавлено через 1 час 10 минут
Цитата Сообщение от Gae4ka_1 Посмотреть сообщение
Всем привет!
n <=10 000 и n натеральное!
Зарание спасибо!
представь себе 2 в 10000 степени - такого числа даже long double не знает)
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
24.10.2009, 22:01     Вычисление 2^n, где n<=10000 #5
Ну, это проблема long double
Gae4ka_1,используй т.н. "длинную арифметику", и все получится! Например, http://gmplib.org/
Ну или любую другую реализацию. Возможно, эту самую реализацию тебе нужно написать самостоятельно; во всяком случае, имеющиеся в Инете исходники - хорошая отправная точка для самостоятельной работы.

Чтобы было легче искать ошибки, вот конечный результат:
2 в степени 10000 =
1995063116880758384883742162683585083823496831886192454852008949852943883022194663191996168403619459
7899331129423209124271556491349413781117593785932096323957855730046793794526765246551266059895520550
0869181933115425086084606181046855090748660896248880904898948380092539416332578506215683094739025569
1238806522509664387444104675987162698545322286853816169431577562964076283688076073222853509164147618
3956381458969463899410840960536267821064621427333394036525565649530603142680234969400335934316651459
2977732796657756061725820314079941981796073782456837622800373028854872519008344645814546505579296014
1483392161573458813925709537976911927780082695773567444412306201875783632550272832378927071037380286
6393031428133241401624195671690574061419654342324638801248856147305207431992259611796250130992860241
7083408076059323201612684922884962558413128440615367389514871142563151110897455142033138202029316409
5759646475601040584584156607204496286701651506192063100418642227590867090057460641785695191145605506
8251250406007519842261898059237118054444788072906395242548339221982707404473162376760846613033778706
0398034131971334936546227005631699374555082417809728109832913144035718775247685098572769379264332215
9939987688666080836883783802764328277517227365757274478411229438973381086160742325329197481312019760
4178281965697475898164531258434135959862784130128185406283476649088690521047580882615823961985770122
4070443305830758690393196046034049731565832086721059133009037528234155397453943977152574552905102123
1094732161075347482574077527398634829849834075693795564663862187456949927901657210370136443313581721
4311791398222983845847334440270964182851005072927748364550578634501100852987812389473928699540834346
1588070439591189858151457791771436196987281314594837832020814749821718580113890712282509058268174362
2057747592141765371568772561490458290499246102863008153558330813010198767585623434353895540917562340
0844887526162643568648833519463720377293240094456246923254350400678027273837755376406726898636241037
4914109667185570507590981002467898801782719259533812824219540283027594084489550146766683896979968862
4163631337639390337345580140763674187771105538422573949911018646821969658165148513049422236994771476
3069155468217682876200362777257723781365331611196811280792669481887201298643660768551639860534602297
8715575179473852463694469230878942659482170080511203223654962881690357391213683383935917564187338505
1097027161391543959099159815465441733631165693603112224993796999922678173235802311186264457529913575
8175008199839236284615249881088960232244362173771618086357015468484058622329792853875623486556440536
9626220189635710288123615675125433383032700290976686505685571575055167275188991941297113376901499161
8131517154400772865057318955745092033018530484711381831540732405331903846208403642176370391155063978
9000742853672196280903477974533320468368795868580237952218629120080742819551317948157624448298518461
5097048880272747215746881315947504097321150804981904558034168269497871413160632106863915116817743047
92596709376
( execution time : 0.218 s )
selevit
79 / 75 / 3
Регистрация: 08.10.2008
Сообщений: 296
24.10.2009, 22:08     Вычисление 2^n, где n<=10000 #6
интересно, с какой целью бывает нужно вычислить 2 в 10 000 степени я думаю обычному земному программисту это ни к чему, а обычной студентке так тем более
MotherBoard
Путешественница
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,843
24.10.2009, 22:14     Вычисление 2^n, где n<=10000 #7
Цитата Сообщение от selevit Посмотреть сообщение
представь себе 2 в 10000 степени - такого числа даже long double не знает)
Ну да! Вот только тип Дабл - 8 метров памяти,тип Лонг - 4 метра памяти.... А Лонг Дабл?? сколько занимает памяти и какие хранит значения??? Что-то не найду....
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
24.10.2009, 22:18     Вычисление 2^n, где n<=10000 #8
Ошибаешься Обычному "земному программисту" операции с такими сумасшедшими числами все же бывают иногда нужны - это обыкновенная прикладная криптография; например, криптоключ длиной в 4096 бит - это, грубо говоря, 2 в степени 4096....

Добавлено через 2 минуты
MotherBoard, про long double - например, http://en.wikipedia.org/wiki/Long_double
MotherBoard
Путешественница
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,843
24.10.2009, 22:24     Вычисление 2^n, где n<=10000 #9
Цитата Сообщение от CheshireCat Посмотреть сообщение
MotherBoard, про long double - например, http://en.wikipedia.org/wiki/Long_double
Было бы оно на русском языке! Я с инглишем хромаю....

Добавлено через 1 минуту
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ошибаешься Обычному "земному программисту" операции с такими сумасшедшими числами все же бывают иногда нужны - это обыкновенная прикладная криптография; например, криптоключ длиной в 4096 бит - это, грубо говоря, 2 в степени 4096....
Для таких крупных данных,где не требуется отрицательных чисел,можно пользоваться беззнаковым типом данных с удвоенной границей диапазона......
selevit
79 / 75 / 3
Регистрация: 08.10.2008
Сообщений: 296
24.10.2009, 22:27     Вычисление 2^n, где n<=10000 #10
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ошибаешься Обычному "земному программисту" операции с такими сумасшедшими числами все же бывают иногда нужны - это обыкновенная прикладная криптография; например, криптоключ длиной в 4096 бит - это, грубо говоря, 2 в степени 4096....
не спорю, что нужны, но зачем они нужны студентке 1го курса?
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
24.10.2009, 22:58     Вычисление 2^n, где n<=10000 #11
зачем они нужны студентке 1го курса?
Ей знакомый парень-программист сказал что если она вычислит число 2^10000, то он будет с ней дружить
selevit
79 / 75 / 3
Регистрация: 08.10.2008
Сообщений: 296
24.10.2009, 23:25     Вычисление 2^n, где n<=10000 #12
Цитата Сообщение от odip Посмотреть сообщение
Ей знакомый парень-программист сказал что если она вычислит число 2^10000, то он будет с ней дружить
жжошь
MotherBoard
Путешественница
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,843
24.10.2009, 23:37     Вычисление 2^n, где n<=10000 #13
Цитата Сообщение от selevit Посмотреть сообщение
жжошь
Зачем да почему? Оффтоп пошёл.....)))
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
25.10.2009, 01:06     Вычисление 2^n, где n<=10000 #14
Вычисления подобных значений, а также 100000! и подобных длинных целых необходимо для общего развития студентов. Закрыли обсуждения данного вопроса
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
25.10.2009, 09:28     Вычисление 2^n, где n<=10000 #15
Gae4ka_1, классы знаешь? про обсуждение - типичная олимпиадная задачка

Добавлено через 20 минут
вот так выглядит сравнения двух до неприличия больших чисел [100 000].[100 000] если постаратся немножко, по этому примеру можно написать и возведение в степень
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
#include <fstream>
#include <iostream>
using namespace std;
class fmilion
{
private:
char *strc,*strd;
int lenc,lend;
public:
    fmilion(char *c)
    {
        int i=0;lenc=0;lend=0;int k=0;
        for(;c[i]=='0';i++);
        for(;c[i]!='.'&&c[i]!=0;i++)
                    lenc++;
        if(lenc)
        {
            strc=new char[lenc+1];
            for(int j=i-lenc;j<i;j++)
                {strc[k]=c[j];k++;}
            strc[k]=0;
            k=0;
        }
        if(c[i]==0){strd=NULL;lend=0;return;}
        i++;
        for(;c[i]!=0;i++)
        lend++;
        strd=new char[lend+1];
        for(int j=i-lend;j<i;j++)
        {strd[k]=c[j];k++;}
        strd[k]=0;
    }
~fmilion()
{
delete strc;
delete strd;
}
 
int fmilioncmp(fmilion &a)
{
    if(lenc!=a.lenc){if (lenc>a.lenc)return 1 ;else return -1;}
        
    int i=0;
    while(i<lenc)
    {
        if(strc[i]!=a.strc[i]){if(strc[i]>a.strc[i])return 1;else return -1;}
    i++;
    }
    if(lend!=0||a.lend!=0){
    int j,k;
    if (lend>a.lend){j=a.lend;k=lend;
        for(int e=0;e<i;e++)
        if(strd[e]!=a.strd[e]){if(strd[e]>a.strd[e])return 1;else return -1;}
    for(;k>i;k--)
        if(strd[k]!='0')return 1;}
    else{j=lend,k=a.lend;
        for(int e=0;e<j;e++)
        if(strd[e]!=a.strd[e]){if(strd[e]>a.strd[e])return 1;else return -1;}
    for(;k>j;k--)
        if(strd[k]!='0')return -1;}}
    return 0;
}
};
void main()
{
//time_t z=time(NULL);
char a[200001],b[200001];
ifstream fin("input.txt",ios::in);
fin>>a>>b;
fmilion e(a);
fmilion f(b);
int c=e.fmilioncmp(f);
ofstream fout("output.txt",ios::out);
fout<<c;
fin.close();
fout.close();
//cout<<c<<endl;
//time_t x=time(NULL);
//cout<<x-z<< "sec";
//cin>>c;
return;
}
Gae4ka_1
3 / 3 / 0
Регистрация: 19.10.2009
Сообщений: 28
25.10.2009, 16:43  [ТС]     Вычисление 2^n, где n<=10000 #16
Спасибо всем огромное!

Я написала код, вдруг он кому то тоже пригодится ....

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
#include <iostream.h>
#include <math.h>
#include <conio.h>
 
int main()
{
    int d;
    int x = 2;
    int i, j, t, c=0;
    int m[25000];
    clrscr();
    cout<<"Please enter degree of 2: ";
    cin>>d;
    while(d>10000)
    {
        cout<<"n > 10 000 No correct entered!"<<endl;
        cout<<"Please enter degree of 2:  ";
        cin>>d;
    }
    for(i=0; i<25000; i++)
        m[i]=0;
    m[0] = 1;
    t = 0;
    for(i=0; i<d; i++)
    {
        for(j=0; j<25000; j++)
        {
            if ( t!=0 )
                m[j]=m[j]*x+t;
            else
                m[j]=m[j]*x;
            t = 0;
            if ( m[j]>9 )
            {
                t=m[j]/10;
                m[j]=m[j]%10;
 
            }
        }
    }
    for(i=d-1; i>=0; i--)
    {
        if (m[i]==0)
            c=c+1;
        else
        break;
    }
 
    for(i=d-c-1; i>=0; i--)
        cout<<m[i];
        getch();
}
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.10.2009, 16:52     Вычисление 2^n, где n<=10000 #17
Д. Кнут - Искусство программирования.
Смотрим 2 том, умножение длинных чисел. Возведение в степень приводим к циклическому умножению.
Gae4ka_1
3 / 3 / 0
Регистрация: 19.10.2009
Сообщений: 28
25.10.2009, 16:56  [ТС]     Вычисление 2^n, где n<=10000 #18
Цитата Сообщение от odip Посмотреть сообщение
Ей знакомый парень-программист сказал что если она вычислит число 2^10000, то он будет с ней дружить
Смешно )))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2009, 17:01     Вычисление 2^n, где n<=10000
Еще ссылки по теме:

C++ Строка в 10000 символов
Решение системы уравнений с N>=10000 переменными C++
C++ Палиндром в интервале от 10000 до 99999
Организовать цикл do/while, который принимает целые числа с клавиатуры и вычитает их из 10000 C++
C++ Длинная арифметика. Факториал 1 <= n <= 10000

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.10.2009, 17:01     Вычисление 2^n, где n<=10000 #19
Цитата Сообщение от Gae4ka_1 Посмотреть сообщение
m[j]=m[j]%10
Очень медленная операция, кстати. Советуется использовать умножение и вычитание (учитывая, что результат обычного деления уже известен) вместо модульного деления.
Yandex
Объявления
25.10.2009, 17:01     Вычисление 2^n, где n<=10000
Ответ Создать тему
Опции темы

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