我需要在 FreePascal 中使用非常大的数字(例如 INT64)来处理 round 或 trunc 函数
I need to work with round or trunc functions in FreePascal with very big numbers(such as INT64)
var a,c,i,y,k:cardinal;
z:real;
check:boolean;
repet:array[1..1000] of cardinal;
tripet:array[1..1000,1..2] of real;
begin
read(c);
i:=1;
for a:=1 to (c) do
begin
z:= sqrt(c*c-a*a);
if (c=round(z)) or (round(z)=0) then continue;
if z=round(z) then
begin
check:=false;
for k:=1 to i do if repet[k]=z then check:=true;
if (check) then continue;
tripet[i][1]:=a;
tripet[i][2]:=z;
repet[i]:=a;
i:=i+1;
end;
end;
if i=1 then write('Nope');
for y:=1 to (i-1) do writeln(tripet[y][1]:0:0,' ',tripet[y][2]:0:0);
end.
问题出在 round(z) 中,它带来了太大的 z number.It 需要 Int32 类型。
但我需要更大的 number:for 距离值可以在 1 到 10^12
之间
我该如何解决?
您使用的是 32 位类型的 cardinal,可能找到了匹配的回合。尝试使用 64 位类型或使用 int64(c)=round(z) 强制 64 位舍入?
var a,c,i,y,k:cardinal;
z:real;
check:boolean;
repet:array[1..1000] of cardinal;
tripet:array[1..1000,1..2] of real;
begin
read(c);
i:=1;
for a:=1 to (c) do
begin
z:= sqrt(c*c-a*a);
if (c=round(z)) or (round(z)=0) then continue;
if z=round(z) then
begin
check:=false;
for k:=1 to i do if repet[k]=z then check:=true;
if (check) then continue;
tripet[i][1]:=a;
tripet[i][2]:=z;
repet[i]:=a;
i:=i+1;
end;
end;
if i=1 then write('Nope');
for y:=1 to (i-1) do writeln(tripet[y][1]:0:0,' ',tripet[y][2]:0:0);
end.
问题出在 round(z) 中,它带来了太大的 z number.It 需要 Int32 类型。
但我需要更大的 number:for 距离值可以在 1 到 10^12
之间我该如何解决?
您使用的是 32 位类型的 cardinal,可能找到了匹配的回合。尝试使用 64 位类型或使用 int64(c)=round(z) 强制 64 位舍入?