Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


РАССЫЛКИ ПОРТАЛА RFPRO.RU

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

Асмик Гаряка
Статус: Бездельник
Рейтинг: 233
∙ повысить рейтинг »
mklokov
Статус: Средняя группа
Рейтинг: 135
∙ повысить рейтинг »
Delph
Статус: Ясельная группа
Рейтинг: 24
∙ повысить рейтинг »

∙ Pascal / Delphi / Lazarus

Номер выпуска:1714
Дата выхода:01.04.2017, 18:15
Администратор рассылки:Зенченко Константин Николаевич (Чебуратор)
Подписчиков / экспертов:25 / 22
Вопросов / ответов:1 / 1

Консультация # 190772: Здравствуйте! У меня возникли сложности с таким вопросом: Как можно посчитать подобные вычисления? (большие числа) //PascalABC int64 и BigInteger не воспринимает

Консультация # 190772:

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

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

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


Дата отправки: 22.03.2017, 17:46
Вопрос задал: almazmr (УчаснеГ)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Чебуратор):

Здравствуйте, 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 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное