Консультация № 190772
22.03.2017, 17:46
0.00 руб.
0 3 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.


Обсуждение

давно
Старший Модератор
31795
6196
22.03.2017, 18:39
общий
Адресаты:
Проблема в том, что целый тип в РАВС имеет разрядность 32-а бита.

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

давно
Старший Модератор
31795
6196
24.03.2017, 19:48
общий
Адресаты:
У вас получилось, что либо?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
29.03.2017, 16:21
общий
это ответ
Здравствуйте, almazmr!

Для вычислений больших чисел, есть "длинная" арифметика. Основные алгоритмы можно найти в статье С.М. Окулов. "Длинная" арифметика.
Код написанный по мотивам С.М. Окулова смотрите в приложении:
[code lang=pascal h=250] { }
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.[/code]

Ну или так посчитать:
[code lang=pascal h=50]begin
writeln(Round(17*Frac(power(3,24)/17)));
end.[/code]

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа