Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2009, 02:16   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Кому интересно предлагаю задачку =)

Делать было нечего и я вспомнил задачку со школьной олимпиады =)
Суть заключалась в том, что бы возвести число 2 в некоторую степень n (n>62). Тогда я был не в состоянии написать это, но сейчас осилил за 20 минут). Дело в том, что integer может взять только 2^31, а longint 2^62.

Если что-нибудь придумали - выкладывайте - потом сравним.

P.s. калькулятор семёрки берёт 2^30000, но не в состоянии осилить 2^35000
TwiX вне форума Ответить с цитированием
Старый 08.08.2009, 02:26   #2
TAVulator
Программист
Форумчанин
 
Аватар для TAVulator
 
Регистрация: 23.07.2009
Сообщений: 101
По умолчанию

о )) стандартная задача на большие числа :-)
Если вы верите, что можете или не можете
сделать что-то, вы правы в обоих случаях.

______________________________(С) Г.Форд
TAVulator вне форума Ответить с цитированием
Старый 08.08.2009, 02:47   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

строковая алгебра.

Цитата:
Дело в том, что integer может взять только 2^31, а longint 2^62.
есть еще Int64
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.08.2009, 03:52   #4
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
Если что-нибудь придумали - выкладывайте - потом сравним.
А вы с помощью длинной арифметики решили? Если да, то так нечестно :-)

Если без длинной ар-ки, то так:
Код:
long double f(int n) {return 1 << n;}
Дойдем до 2^32, а так:
Код:
long double g(int n) {return exp(n*log(2));}
до 2^1024.

Последний раз редактировалось BaronTreep; 08.08.2009 в 03:55.
BaronTreep вне форума Ответить с цитированием
Старый 08.08.2009, 03:52   #5
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

В остальном - только длинная арифметика.

Хотя, в принципе, ничего считать не надо - 2^n в двоичной системе счисления это 1 и n-штук 0. Просто берем память и раставляем в ней биты, другое дело - чтобы дальше с этой памятью работать нужна длинная арифметика.

Последний раз редактировалось BaronTreep; 08.08.2009 в 04:15.
BaronTreep вне форума Ответить с цитированием
Старый 08.08.2009, 12:27   #6
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

У меня прога считаем 2^40000 =)

А если переводитьв всё это в двоичную систему, то памяти уж точно не хватит...
TwiX вне форума Ответить с цитированием
Старый 08.08.2009, 14:43   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
У меня прога считаем 2^40000 =)
А если переводитьв всё это в двоичную систему, то памяти уж точно не хватит...
На 2^40000 в двоичной системе уж памяти точно хватит. А так тут даже не умножение, а сложение, так что это действительно для школьной олимпиады.
Somebody вне форума Ответить с цитированием
Старый 08.08.2009, 15:05   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Somebody, ну на двоичное число памяти полюбому хватит. А вот для того, чтобы это длинное двоичное число перевести в десятичную систему - вот тут уж без длинной арифметики не обойтись...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.08.2009, 17:55   #9
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Код:
function Power2(n: cardinal): string;
begin
  Result:='1';
  while (n>0) do
     begin
        Result:=Result+'0';
        Dec(n);
     end;
end;
полторы минуты
Sergey2 вне форума Ответить с цитированием
Старый 08.08.2009, 18:11   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Sergey2
полторы минуты
тонко намекаю :
2^10 = 1024 ... Ваша функция выдаст такой результат?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите, может кому интересно будет Gab Свободное общение 6 04.09.2012 15:09
Интересно (Builder) alun Общие вопросы C/C++ 0 16.01.2009 12:56