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

Длинная арифметика - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Shevva
 Аватар для Shevva
17 / 17 / 0
Регистрация: 13.09.2009
Сообщений: 140
05.01.2010, 20:34     Длинная арифметика #1
Помогите пожалуйста дорешать программу, она считает 2 в 200 степени, я коечто написал, но препод сказал, что прога выдаёт не полное число, помогите, или подскажите как переделать этот код:
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<iostream>
 
int main()
{
        int const dimm =60;//60 магическое число, ага.(2^200=1.xxx*10^60)
        int base = 10;// можно любую, с 10 проще ввод-вывод организовывать.
        int a[dimm];
        for(int i=0;i<dimm;i++) a[i]=0;
        
        a[1]=1;
        for(int i=1;i<=200;i++)
        {
                for(int j=0;j<dimm;j++) a[j]*=2;// чтоб не париться, умножаем всё
                for(int j=0;j<dimm-1;j++)
                        if(a[j]>=base) //проверка на перенос
                        { 
                                        a[j+1] +=(a[j]-a[j]%base)/base;//перенос в старший разряд       
                                        a[j] =a[j]%base;
                        }
        }
        printf("2^200 = ");
        for (int i=dimm-1;i>=0;i--) printf("%u",a[i]);
        printf("\n  ");system("pause");
        return 0;
}
Добавлено через 1 час 4 минуты
отзовитесь кто-то!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2010, 20:34     Длинная арифметика
Посмотрите здесь:

C++ Длинная арифметика
C++ Длинная арифметика
C++ Длинная арифметика
C++ Длинная арифметика
C++ Длинная арифметика
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2010, 21:11     Длинная арифметика #2
2^5 = 1*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 0*2^1 + 0*2^0

то есть тебе реально нужно только нули и еденицы записать в массив
потом просто их вывести в обратном порядке
а для числа 2^200 будет вообще: идут одни нули, а n[200] = 1;
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
05.01.2010, 21:15     Длинная арифметика #3
Цитата Сообщение от accept Посмотреть сообщение
2^5 = 1*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 0*2^1 + 0*2^0

то есть тебе реально нужно только нули и еденицы записать в массив
потом просто их вывести в обратном порядке
а для числа 2^200 будет вообще: идут одни нули, а n[200] = 1;
помоему всё правильно у человека, тока он с порядком обшибся
Shevva, попробуй int const dimm =70; сделать и посмотреть что станет, будет 8м нулей, то есть при 60 два значащих числа ты глотаешь

хотя нет, там странно получается

вот это смутило a[1]=1; почему со второго элемента начинается массив?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
05.01.2010, 21:26     Длинная арифметика #4
Самая главная ошибка в коде - строка 10:
Цитата Сообщение от Shevva Посмотреть сообщение
a[1]=1;
За счет этой строки с правой стороны правильного ответа добавляется 0.
Кроме того (хотя ошибки здесь нет), можно строку 17:
Цитата Сообщение от Shevva Посмотреть сообщение
a[j+1] +=(a[j]-a[j]%base)/base;
переписать так:
C
1
a[j+1] +=a[j]/base;
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2010, 21:44     Длинная арифметика #5
Цитата Сообщение от TanT
помоему всё правильно у человека, тока он с порядком обшибся
да, у меня алгоритм для вывода двоичной записи, я чо-то не подумал
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.01.2010, 21:44     Длинная арифметика #6
может я что то не понял но разве не так?
C++
1
2^200
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2010, 21:59     Длинная арифметика #7
1.60693804426e+60
это 61 элемент

Добавлено через 2 минуты
C++
1
for(int i=1;i<=200;i++)
обычно выглядит так

C++
1
for(int i = 0; i < 200; i++)
Добавлено через 37 секунд
МедведЪ, 1606938044258990275541962092341162602522202993782792835301376

Добавлено через 1 минуту
пробел в числе это не я
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.01.2010, 22:00     Длинная арифметика #8
Цитата Сообщение от accept Посмотреть сообщение
МедведЪ, 16069380442589902755419620923411626025222029937827 92835301376
как О_О а настоящий ответ какой
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
05.01.2010, 22:03     Длинная арифметика #9
В смысле? accept тебе и привел полный ответ: это и есть 2^200.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2010, 22:04     Длинная арифметика #10
ну, это и есть настоящий с калькулятора, форум только число поделил на две части
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.01.2010, 22:08     Длинная арифметика #11
accept, если это настоящий ответ то есть 2^200 но причем тут коды первого поста?что то большой код
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2010, 22:13     Длинная арифметика #12
а вообще, алгоритм классный, помог мне понять как сделать задачу, которую я тут не мог сделать давно

Добавлено через 1 минуту
МедведЪ, а он его в массиве накапливает, все эти цифры являются отдельными элементами в одном массиве

Добавлено через 1 минуту
то есть сам алгоритм даёт возможность посчитать любое число, равное степени двойки до двухсотой степени, включая и двухсотую степень
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.01.2010, 22:14     Длинная арифметика #13
Цитата Сообщение от accept Посмотреть сообщение
МедведЪ, а он его в массиве накапливает, все эти цифры являются отдельными элементами в одном массиве


Добавлено через 21 секунду
accept, ааа...

Добавлено через 30 секунд
accept, тогда где массив из 200?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2010, 22:21     Длинная арифметика #14
в том-то и прикол, что хватает массива из 61, потому что число 2^200 - это 1.60693804426e+60 в десятичной системе

Добавлено через 3 минуты
то есть ты шестидесятку превращаешь в 10^60 степени и вот это число 1.60693804426 умножаешь на 10^60
а почему там нулей нет дальше, я не знаю (видимо, из-за хранения чисел в компе)
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.01.2010, 22:22     Длинная арифметика #15
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2010, 22:26     Длинная арифметика #16
а, скорее всего, калькулятор сократил вывод, поэтому там, скорее всего, дробь длиннее

Добавлено через 2 минуты
да, скорее всего

C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include <math.h>
 
int main(void) /* C89 ANSI */
{
    printf("%.50f" "\n", pow(2, 200));
    return 0;
}
вывод
Код
[guest@station src]$ ./test
1606938044258990275541962092341162602522202993782792835301376.00000000000000000000000000000000000000000000000000
[guest@station src]$
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.01.2010, 22:28     Длинная арифметика #17
Цитата Сообщение от accept Посмотреть сообщение
1606938044258990275541962092341162602522202993782792835301376.00000000000000000000000000000000000000000000000000
%)
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2010, 22:33     Длинная арифметика #18
внутри кода, видимо, он цифры в строки превращает, а вне кода, цифры, по ходу, в виде цифр
хотя, может и нет

Добавлено через 2 минуты
кстати, на почту пришло без пробелов, а в первом случае - с пробелом
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
05.01.2010, 22:42     Длинная арифметика #19
а я писал код, который вычисляет 2^50,000 и выдает результат в 10-ичной сис-ме счисления))

Добавлено через 1 минуту
долго правда ждать ответ))

Добавлено через 45 секунд
но 500 цифр за секундц только так успевает обработать))

Добавлено через 2 минуты
да, и еще, по моему я для 2^50,000 брал базу в 1 млрд., т.е. инт, тогда вычсленияе ускоряются в 9 раз и 50000 это за 5 сек проходит))

Добавлено через 1 минуту
особенно если бинарником возносить в степень..
жаль только серв на который я код заасептил не пашет, как только включат покажу код))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2010, 22:50     Длинная арифметика
Еще ссылки по теме:

Длинная арифметика C++
C++ Длинная арифметика

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

Или воспользуйтесь поиском по форуму:
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2010, 22:50     Длинная арифметика #20
Цитата Сообщение от outoftime
да, и еще, по моему я для 2^50,000 брал базу в 1 млрд.
а если умножить их потом надо
тут была задача на разные операции: сложение, умножение, деление
смог бы умножить так, чтобы не запутаться ?
Yandex
Объявления
05.01.2010, 22:50     Длинная арифметика
Ответ Создать тему

Метки
длинная арифметика
Опции темы

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