3 / 3 / 0
Регистрация: 19.10.2009
Сообщений: 28
1

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

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

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

Зарание спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2009, 16:26
Ответы с готовыми решениями:

Random-ное уникальное значение от 1 до 10000, 10000 элементов
Здравствуйте! Подскажите есть задача вывести случайным порядком значения от 1 до 10000...

В возрастающем порядке напечатать целые числа из диапазона 1.. 10000, представимые в виде n2 + m2, где n, m>0
Помогите решить, заранее спасибо) В возрастающем порядке напечатать целые числа из диапазона 1.....

Вычисление выражения D=A*B*C, где A=6, В=3, С=2
Собственно вопрос Помогите наисать фрагмент программы на assembler

Где используется параллельное вычисление?
Здравствуйте. Надеюсь, эта тема по теме) Подскажите пожалуйста, где используется параллельное...

18
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
24.10.2009, 16:32 2
тебе необходимо использовать длинную арифметику
заводишь массив char* на примерно 10 000 элементов и с помощь цикла считаешь, вычисление по времени выйдет около 1 сек без этого никак ибо самое большое число это 2 в 64 степени
1
3 / 3 / 0
Регистрация: 19.10.2009
Сообщений: 28
24.10.2009, 17:12  [ТС] 3
я понимаю... но если можно ссылку с примером...
0
91 / 77 / 6
Регистрация: 08.10.2008
Сообщений: 296
24.10.2009, 21:31 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 не знает)
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
24.10.2009, 22:01 5
Ну, это проблема long double
Gae4ka_1,используй т.н. "длинную арифметику", и все получится! Например, http://gmplib.org/
Ну или любую другую реализацию. Возможно, эту самую реализацию тебе нужно написать самостоятельно; во всяком случае, имеющиеся в Инете исходники - хорошая отправная точка для самостоятельной работы.

Чтобы было легче искать ошибки, вот конечный результат:
2 в степени 10000 =
19950631168807583848837421626835850838234968318861924548520089498529438830221946 63191996168403619459
78993311294232091242715564913494137811175937859320963239578557300467937945267652 46551266059895520550
08691819331154250860846061810468550907486608962488809048989483800925394163325785 06215683094739025569
12388065225096643874441046759871626985453222868538161694315775629640762836880760 73222853509164147618
39563814589694638994108409605362678210646214273333940365255656495306031426802349 69400335934316651459
29777327966577560617258203140799419817960737824568376228003730288548725190083446 45814546505579296014
14833921615734588139257095379769119277800826957735674444123062018757836325502728 32378927071037380286
63930314281332414016241956716905740614196543423246388012488561473052074319922596 11796250130992860241
70834080760593232016126849228849625584131284406153673895148711425631511108974551 42033138202029316409
57596464756010405845841566072044962867016515061920631004186422275908670900574606 41785695191145605506
82512504060075198422618980592371180544447880729063952425483392219827074044731623 76760846613033778706
03980341319713349365462270056316993745550824178097281098329131440357187752476850 98572769379264332215
99399876886660808368837838027643282775172273657572744784112294389733810861607423 25329197481312019760
41782819656974758981645312584341359598627841301281854062834766490886905210475808 82615823961985770122
40704433058307586903931960460340497315658320867210591330090375282341553974539439 77152574552905102123
10947321610753474825740775273986348298498340756937955646638621874569499279016572 10370136443313581721
43117913982229838458473344402709641828510050729277483645505786345011008529878123 89473928699540834346
15880704395911898581514577917714361969872813145948378320208147498217185801138907 12282509058268174362
20577475921417653715687725614904582904992461028630081535583308130101987675856234 34353895540917562340
08448875261626435686488335194637203772932400944562469232543504006780272738377553 76406726898636241037
49141096671855705075909810024678988017827192595338128242195402830275940844895501 46766683896979968862
41636313376393903373455801407636741877711055384225739499110186468219696581651485 13049422236994771476
30691554682176828762003627772577237813653316111968112807926694818872012986436607 68551639860534602297
87155751794738524636944692308789426594821700805112032236549628816903573912136833 83935917564187338505
10970271613915439590991598154654417336311656936031122249937969999226781732358023 11186264457529913575
81750081998392362846152498810889602322443621737716180863570154684840586223297928 53875623486556440536
96262201896357102881236156751254333830327002909766865056855715750551672751889919 41297113376901499161
81315171544007728650573189557450920330185304847113818315407324053319038462084036 42176370391155063978
90007428536721962809034779745333204683687958685802379522186291200807428195513179 48157624448298518461
50970488802727472157468813159475040973211508049819045580341682694978714131606321 06863915116817743047
92596709376
( execution time : 0.218 s )
1
91 / 77 / 6
Регистрация: 08.10.2008
Сообщений: 296
24.10.2009, 22:08 6
интересно, с какой целью бывает нужно вычислить 2 в 10 000 степени я думаю обычному земному программисту это ни к чему, а обычной студентке так тем более
1
Путешественница
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,842
24.10.2009, 22:14 7
Цитата Сообщение от selevit Посмотреть сообщение
представь себе 2 в 10000 степени - такого числа даже long double не знает)
Ну да! Вот только тип Дабл - 8 метров памяти,тип Лонг - 4 метра памяти.... А Лонг Дабл?? сколько занимает памяти и какие хранит значения??? Что-то не найду....
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
24.10.2009, 22:18 8
Ошибаешься Обычному "земному программисту" операции с такими сумасшедшими числами все же бывают иногда нужны - это обыкновенная прикладная криптография; например, криптоключ длиной в 4096 бит - это, грубо говоря, 2 в степени 4096....

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

Добавлено через 1 минуту
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ошибаешься Обычному "земному программисту" операции с такими сумасшедшими числами все же бывают иногда нужны - это обыкновенная прикладная криптография; например, криптоключ длиной в 4096 бит - это, грубо говоря, 2 в степени 4096....
Для таких крупных данных,где не требуется отрицательных чисел,можно пользоваться беззнаковым типом данных с удвоенной границей диапазона......
1
91 / 77 / 6
Регистрация: 08.10.2008
Сообщений: 296
24.10.2009, 22:27 10
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ошибаешься Обычному "земному программисту" операции с такими сумасшедшими числами все же бывают иногда нужны - это обыкновенная прикладная криптография; например, криптоключ длиной в 4096 бит - это, грубо говоря, 2 в степени 4096....
не спорю, что нужны, но зачем они нужны студентке 1го курса?
1
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
24.10.2009, 22:58 11
зачем они нужны студентке 1го курса?
Ей знакомый парень-программист сказал что если она вычислит число 2^10000, то он будет с ней дружить
1
91 / 77 / 6
Регистрация: 08.10.2008
Сообщений: 296
24.10.2009, 23:25 12
Цитата Сообщение от odip Посмотреть сообщение
Ей знакомый парень-программист сказал что если она вычислит число 2^10000, то он будет с ней дружить
жжошь
1
Путешественница
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,842
24.10.2009, 23:37 13
Цитата Сообщение от selevit Посмотреть сообщение
жжошь
Зачем да почему? Оффтоп пошёл.....)))
1
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
25.10.2009, 01:06 14
Вычисления подобных значений, а также 100000! и подобных длинных целых необходимо для общего развития студентов. Закрыли обсуждения данного вопроса
1
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
25.10.2009, 09:28 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;
}
1
3 / 3 / 0
Регистрация: 19.10.2009
Сообщений: 28
25.10.2009, 16:43  [ТС] 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();
}
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
25.10.2009, 16:52 17
Д. Кнут - Искусство программирования.
Смотрим 2 том, умножение длинных чисел. Возведение в степень приводим к циклическому умножению.
1
3 / 3 / 0
Регистрация: 19.10.2009
Сообщений: 28
25.10.2009, 16:56  [ТС] 18
Цитата Сообщение от odip Посмотреть сообщение
Ей знакомый парень-программист сказал что если она вычислит число 2^10000, то он будет с ней дружить
Смешно )))
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
25.10.2009, 17:01 19
Цитата Сообщение от Gae4ka_1 Посмотреть сообщение
m[j]=m[j]%10
Очень медленная операция, кстати. Советуется использовать умножение и вычитание (учитывая, что результат обычного деления уже известен) вместо модульного деления.
1
25.10.2009, 17:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2009, 17:01
Помогаю со студенческими работами здесь

Вычисление последовательности 1-1/2+1/3-1/4+1/5-1/6 ….-1/n , где n<=1000000
1) Разработать программу posled1.c вычисления суммы последовательности 1-1/2+1/3-1/4+1/5-1/6...

Вычисление значения выражения: где ошибка?
исходник задания приложен PROGRAM pr3; Var x,y,z,U,i,c,b,h:real; FUNCTION Fn(a:real):real; ...

Вычисление НОД. не могу понять где ошибка.
#include &quot;stdio.h&quot; #include &quot;conio.h&quot; int NOD (int x,int y) { while (x!=y) { if (x&gt;y)...

подскажите, где ошибка? вычисление арифметическое прогрессии
доброго времени суток!) дали задачку на SWI Prologe реализовать: &quot;вычислите сумме элементов...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru