Free Pascal中的平方和运算

来源:百度知道 编辑:UC知道 时间:2024/06/22 14:37:43
这个程序中当j加到四万多时就爆掉了,为什么,他不是longint 吗
var
n,nn:qword;
s:array[1..255] of integer;
lens:integer;
j:longint;

procedure jia(nn:longint);
var
strnn:string;
lennn:integer;
nnar:array[1..255] of integer;
x:longint;
i:integer;
max:integer;
begin
max:=0;
lens:=255;
while (s[lens]=0) and (lens>1) do lens:=lens-1;
str(nn,strnn);
lennn:=length(strnn);
for i:=1 to lennn do nnar[i]:=ord(strnn[lennn-i+1])-ord('0');
if lennn>lens then max:=lennn else max:=lens;
x:=0;
for i:=1 to max do
begin
s[i]:=s[i]+x+nnar[i];
x:=s[i] div 10;
s[i]:=s[i] mod 10;
end;
s[i+1]:=x;
for i:=1 to 255 do nnar[i]:=0;
end;
begin
read(n);
for j:=1 to n do
begin
nn:=j*j;
jia(nn);
write(j,&

j 四万多,那J平方呢?不久超过longint范围了啊,把nn改为int64

longint也是有最大上限的,longint最大上限为21亿多。当j四万多时,平方和肯定超出longint范围了嘛!最好用高精度,如果不会,那么建议你用qword或int64(qword和int64其实一样大,不过qword是int64的无符号类型,也就是int64有负数,qword没有,但在正整数中,qword范围比int64大,在这里还是用qword好,因为这里不需要用负数),不过,qword和int64虽然都是整型,但是都是无序类型,不能做为记数循环(也就是for循环)的循环变量。

sqr(j)<=sqr(40000)=1600000000,最好为qword

用qword和extended或int64,最好用高精度。

使用QWORD类型(除了循环变量)