29.05.2017, 20:09 [+3 UTC]
в нашей команде: 1 987 чел. | участники онлайн: 4 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
29.05.2017, 18:14

Последний вопрос:
29.05.2017, 17:22

Последний ответ:
29.05.2017, 09:18

Последняя рассылка:
29.05.2017, 18:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
25.02.2012, 20:11 »
Даровко Антон Владимирович
Задача решена на отлично! [вопрос № 185492, ответ № 270050]
20.03.2010, 19:58 »
Розанкова Наталья Юрьевна
Боже спасибо большое Shvetski!!!!!! Вы мне очень помогли, спасибо!!!!!!!!!! [вопрос № 177366, ответ № 260259]

РАЗДЕЛ • Pascal / Delphi / Lazarus

Создание программ на языках Pascal, Delphi и Lazarus.

[администратор рассылки: Зенченко Константин Николаевич (Модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 131
mklokov
Статус: 5-й класс
Рейтинг: 104
Ксюша
Статус: 1-й класс
Рейтинг: 2

Перейти к консультации №:
 

Консультация онлайн # 190772
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: almazmr (Посетитель)
Отправлена: 22.03.2017, 17:46
Поступило ответов: 1

Здравствуйте! У меня возникли сложности с таким вопросом:

Как можно посчитать подобные вычисления? (большие числа)
//PascalABC
int64 и BigInteger не воспринимает

var
i:real;
a,p:integer;
begin
p:=17;
i:=power(3,24);
a:=trunc(i) mod p;
writeln(a);
end.


Состояние: Консультация закрыта

Здравствуйте, almazmr!

Для вычислений больших чисел, есть "длинная" арифметика. Основные алгоритмы можно найти в статье С.М. Окулов. "Длинная" арифметика.
Код написанный по мотивам С.М. Окулова смотрите в приложении:

Код (Pascal) :: выделить код
 {   }
  function Reverse(a:string):string;
    var
      b,c:integer;
      d:char;
    begin
      b:=1;
      c:=length(a);
      while b<c do
        begin
          d:=a[b];
          a[b]:=a[c];
          a[c]:=d;
          inc(b);
          dec(c);
        end;
      Reverse:=a;
    end;
  {    }
  function LongMore(a,b:string):boolean;
    begin
      while length(a)>length(b) do b:='0'+b;
      while length(b)>length(a) do a:='0'+a;
      while(length(a)>0)and(a[1]=b[1])do
        begin
          delete(a,1,1);
          delete(b,1,1);
        end;
      LongMore:=(length(a)>0)and(a[1]>b[1]);
    end;
  {    }
  function LongMoreEqui(a,b:string):boolean;
    begin
      while length(a)>length(b) do b:='0'+b;
      while length(b)>length(a) do a:='0'+a;
      while(length(a)>0)and(a[1]=b[1])do
        begin
          delete(a,1,1);
          delete(b,1,1);
        end;
      LongMoreEqui:=(length(a)=0)or(a[1]>b[1]);
    end;
  {    }
  function LongSumma(a,b:string):string;
    var
      c:integer;
      d:string;
    begin
      c:=0;
      d:='';
      while(length(a)>0)or(length(b)>0)or(c>0)do
        begin
          if length(a)>0 then
            begin
              c:=c+ord(a[1])-ord('0');
              delete(a,1,1);
            end;
          if length(b)>0 then
            begin
              c:=c+ord(b[1])-ord('0');
              delete(b,1,1);
            end;
          d:=d+chr((c mod 10)+ord('0'));
          c:=c div 10;
        end;
      LongSumma:=d;
    end;
  {    }
  function LongSubtr(a,b:string):string;
    var
      c:integer;
      d:string;
    begin
      a:=Reverse(a);
      b:=Reverse(b);
      c:=0;
      d:='';
      while length(a)>length(b) do b:=b+'0';
      while length(a)>0do
        begin
          if ord(a[1])<(ord(b[1])+c)then
            begin
              d:=d+chr(10+ord(a[1])-ord(b[1])-c+ord('0'));
              c:=1;
            end
            else
            begin
              d:=d+chr(ord(a[1])-ord(b[1])+ord('0')-c);
              c:=0;
            end;
          delete(a,1,1);
          delete(b,1,1);
        end;
      LongSubtr:=Reverse(d);
    end;
  {    }
  function LongMultOne(a:string;b:char):string;
    var
      c,d:integer;
    begin
      d:=1;
      c:=0;
      while(d<=length(a))do
        begin
          c:=c+(ord(a[d])-ord('0'))*(ord(b)-ord('0'));
          a[d]:=chr((c mod 10)+ord('0'));
          c:=c div 10;
          inc(d);
        end;
      while c>0 do
        begin
          a:=a+chr((c mod 10)+ord('0'));
          c:=c div 10;
        end;
      LongMultOne:=a;
    end;
  {    }
  function LongMult(a,b:string):string;
    var
      c:string;
    begin
      c:='';
      while length(b)>0 do
        begin
          c:=LongSumma(c,LongMultOne(a,b[1]));
          delete(b,1,1);
          a:='0'+a;
        end;
      LongMult:=c;
    end;
  {   }
  function LongDivide(a,b:string):string;
    var
      c:string;
      d:integer;
    begin
      while LongMore(a,b) do
        begin
          d:=0;
          while LongMore(b,copy(a,1,length(b)+d))do inc(d);
          c:=copy(a,1,length(b)+d);
          while LongMoreEqui(c,b) do c:=LongSubtr(c,b);
          delete(a,1,length(b)+d);
          while(c[1]='0')and(length(c)>0)do delete(c,1,1);
          a:=c+a;
        end;
      LongDivide:=a;
    end;
  {    }
  function LongPower(a:string;b:integer):string;
    var
      c:string;
    begin
      c:='1';
      while b>0 do
        begin
          c:=LongMult(c,a);
          dec(b);
        end;
      LongPower:=Reverse(c);
    end;
  {main}
  begin
    writeln(LongDivide(LongPower('3',24),'17'));
  end.


Ну или так посчитать:
Код (Pascal) :: выделить код
begin
  writeln(Round(17*Frac(power(3,24)/17)));
end.


Удачи!


Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 29.03.2017, 16:21

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 190772

Зенченко Константин Николаевич
Модератор

ID: 31795

# 1

= общий = | 22.03.2017, 18:39 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
almazmr:

Проблема в том, что целый тип в РАВС имеет разрядность 32-а бита.

Для решения задач с боьшими числами - используется длинная арифметика.
Ознакомтесь С.М. Окулов. "Длинная" арифметика, вопросы задавайте тут, если что.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 2

= общий = | 24.03.2017, 19:48 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
almazmr:

У вас получилось, что либо?

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14189 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн