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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2008, 23:24   #1
katletta
 
Регистрация: 24.10.2008
Сообщений: 5
Вопрос Pascal - возведение 2 в заданную с клавиатуры степень(до 2^32767)

В универе мена озадачили такой задачкой: с клавы вводится натуральное число N ( от 1 до 32767). Надо вывести на экран число 2^N , то есть 2 в заданной степени.N может быть от 1 до 32767(maxInt) включительно. Через экспоненту и вещественный тип можно посчитать и 50ую степень, но на степени 127 и больше выдается ошибка(слишком большое число с пз). Но по условию задачи мне нужно считать степени двойки вплоть до maxInt, то есть 2^maxint=2^32767, а это уже оочень немаленькое число (7,0773051552247739450077651387248e +9863). Какие-нибудь соображения по этому поводу есть?

Последний раз редактировалось katletta; 25.10.2008 в 10:53.
katletta вне форума Ответить с цитированием
Старый 25.10.2008, 10:55   #2
ViNcHeStEr
Delphi
Форумчанин
 
Регистрация: 12.06.2008
Сообщений: 137
По умолчанию

Вот сделал, вроде правильно.
Вложения
Тип файла: rar Delphi.rar (166.8 Кб, 42 просмотров)
ViNcHeStEr вне форума Ответить с цитированием
Старый 25.10.2008, 11:33   #3
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

вот таким образом:
Код:

{глобальные переменные}
var x:array[0..10000] of byte; {само чило}
     n:integer;    {кол-во элементов}


{процедура умножения массива на 2}
procedure f;
var i:integer;
    carry,db:byte;
begin
 carry:=0;
 for i:=1 to n do
  begin
   db:=x[i]*2+carry; {для каждого элемента не забываем прибавлять ту часть, которая обычно "в уме"}
   x[i]:=db mod 10;   {для элемента годятся только цифры от 0 до 9}
   carry:=db div 10;  {остальное переносим "в ум"}
  end;
 if carry>0 then      {если циферки кончились, а "в уме" осталось чето}
  begin
   inc(n);               {увеличим размер числа и запишем в его начало то што "в уме" (как бесит уже эта фраза) }
   x[n]:=carry;
  end;
end;

var a:integer;
    i:integer;
begin
 readln(a);    {вводим степень}
 n:=1;          {длинна числа в массиве=1}
 x[1]:=1;      {число в массиве=1}
 for i:=1 to a do      {домножаем массив a раз}
  f;
 for i:=n downto 1 do   {выводим его в обратном порядке}
  write(x[i]);
 writeln;
 readln;
end.
Объяснение:
Данное решение является частным случаем длинного умножения...... Для тех кто не знаком с длинной арифметикой:
В глобальном массиве x будет храниться наше число. Каждый элемент обозначает разряд и находятся в пределе от 0 до 9. число n показывает их колличество..... в начале программы я заношу в x число "1".... длинна числа тоже 1.... процедура f умножает число, находящееся в массиве x на 2. умножение происходит тупо столбиком.... переменная carry обозначает перенос на следущий разряд.... (кстати в массиве x число записано в обратном порядке).... все что осталось - это повторить процедуру N раз и вывести первые n элементов массива в обратном порядке......


уф))))) надеюсь объяснения исчерпывающие))))))
Надо бы избавиться от привычки ставить многоточие.....

Последний раз редактировалось Min; 25.10.2008 в 22:24. Причина: по вашей просьбе))))
Min вне форума Ответить с цитированием
Старый 25.10.2008, 12:24   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Посмотрите вот на это:

Код:
var M:real;
    D:word;
    k:longint;
begin
   M := 4.294967296; D := 9;  { 2^32 }
   k := 32;
   while k < 200000 do begin
      Writeln('2^',k,' = ', M:10:9, 'e', D);

      M := M*M;
      D := 2*D;
      if M > 10 then begin
         M := M / 10;
         inc(D);
      end;

      k := 2*k;
   end;
Результат
2^32 = 4.294967296e9
2^64 = 1.844674407e19
2^128 = 3.402823669e38
2^256 = 1.157920892e77
2^512 = 1.340780793e154
2^1024 = 1.797693135e308
2^2048 = 3.231700607e616
2^4096 = 1.044388881e1233
2^8192 = 1.090748136e2466
2^16384 = 1.189731495e4932
2^32768 = 1.415461031e9864
2^65536 = 2.003529930e19728
2^131072 = 4.014132182e39456
...
2^262144 = 1.611325717e13377

Надеюсь, метод понятен. Для остальных степеней сами сделаете.

Интересно, что калькулятор Windows легко вычисляет где-то до 2^135000. Дальше "недопустимая функция".
alexBlack вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возведение в степень на Pascal LORD-BY Помощь студентам 32 28.02.2018 07:48
Степень Droid Общие вопросы Delphi 9 26.04.2008 01:51
Возведение в степень Stanislav Общие вопросы Delphi 10 05.12.2007 23:34
Проблема с возведением в степень set Паскаль, Turbo Pascal, PascalABC.NET 5 15.11.2007 02:47
Возведение в степень... Sota Общие вопросы C/C++ 7 18.07.2007 17:05