太长不看![](https://tb2.bdstatic.com/tb/editor/images/face/i\_f25.png?t=20140803)
by chill @ 2017-10-29 20:11:40
@[病名為愛](/space/show?uid=12191) 滑稽~
by liuli234——流离 @ 2017-10-29 20:12:19
@[病名為愛](/space/show?uid=12191) 活捉!
by CaptainSlow @ 2017-10-29 20:12:52
呃,FPA数组贴错了,头上const的应该长这样:
```cpp
const
CARRYNUM=100000000;
NUMLEN=8;
MAXBIT=1260;
FPALEN=7;
FPA:array[1..7]of longint=(10000000,1000000,100000,10000,1000,100,10);
```
还有print过程也贴错了:(j的方向反了)
```cpp
procedure print;
var i,j:longint;
begin
write(a[a[0]]);
for i:=a[0]-1 downto 1 do
begin
for j:=1 to FPALEN do
if (a[i]<FPA[j]) then write(0)
else break;
write(a[i]);
end;
writeln;
end;
```
可这样还是只有30分,求助。。。
by CaptainSlow @ 2017-10-30 10:13:17
减法过程也写反了,不过好像没有什么区别,现在TLE\*2,WA\*5,AC\*3
更新一下减法的两个过程:
```cpp
procedure asubb;
var i:longint;
begin
for i:=1 to a[0] do
begin
a[i]:=a[i]-b[i];
if (a[i]<0) then
begin
dec(a[i+1]);
inc(a[i],CARRYNUM);
end;
end;
while ((a[0]>0) and (a[a[0]]=0)) do dec(a[0]);
end;
procedure bsuba;
var i:longint;
begin
for i:=1 to b[0] do
begin
b[i]:=b[i]-a[i];
if (b[i]<0) then
begin
dec(b[i+1]);
inc(b[i],CARRYNUM);
end;
end;
while ((b[0]>0) and (b[b[0]]=0)) do dec(b[0]);
end;
```
by CaptainSlow @ 2017-10-30 10:21:21
又整改了一下,简化了读入方式,但是还是30分。
错误的答案显示后面几位尾数还是相同,但前面的数有些少了。
贴代码:
```cpp
//Luogu P2152
//SuperGCD
const
CARRYNUM=100000000;
NUMLEN=8;
MAXBIT=1260;
FPALEN=7;
FPA:array[1..7]of longint=(10000000,1000000,100000,10000,1000,100,10);
//FPA-For Printing Array
type
numarr=array[0..MAXBIT]of longint; //[0] saves bits
var
a,b:numarr;
procedure innum;
var len,i,j,k:longint;
num:ansistring;
begin
//readA and turn the num into a array
readln(num);
len:=length(num);
//A new way to read num
a[0]:=len div NUMLEN;
if (len mod NUMLEN<>0) then inc(a[0]);
j:=len;
k:=a[0];
for i:=1 to len do
begin
a[k]:=a[k]*10+ord(num[i])-48;
dec(j);
if (j mod NUMLEN=0) then dec(k);
end;
//Read B
readln(num);
len:=length(num);
b[0]:=len div NUMLEN;
if (len mod NUMLEN<>0) then inc(b[0]);
j:=len;
k:=b[0];
for i:=1 to len do
begin
b[k]:=b[k]*10+ord(num[i])-48;
dec(j);
if (j mod NUMLEN=0) then dec(k);
end;
end;
procedure adiv2;
var i:longint;
begin
for i:=a[0] downto 1 do
begin
if (a[i] mod 2<>0) then inc(a[i-1],CARRYNUM);
a[i]:=a[i] div 2;
end;
while ((a[0]>0) and (a[a[0]]=0)) do dec(a[0]);
end;
procedure bdiv2;
var i:longint;
begin
for i:=b[0] downto 1 do
begin
if (b[i] mod 2<>0) then inc(b[i-1],CARRYNUM);
b[i]:=b[i] div 2;
end;
while ((b[0]>0) and (b[b[0]]=0)) do dec(b[0]);
end;
function cmp:longint;
{FUNCTION CMP:
0 - A=B; 1 - A>B; 2 - A<B;}
var i:longint;
begin
if (a[0]>b[0]) then exit(1);
if (a[0]<b[0]) then exit(2);
for i:=a[0] downto 1 do
if (a[i]>b[i]) then exit(1)
else if (a[i]<b[i]) then exit(2);
exit(0);
end;
procedure asubb;
var i:longint;
begin
for i:=1 to a[0] do
begin
a[i]:=a[i]-b[i];
if (a[i]<0) then
begin
dec(a[i+1]);
inc(a[i],CARRYNUM);
end;
end;
while ((a[0]>0) and (a[a[0]]=0)) do dec(a[0]);
end;
procedure bsuba;
var i:longint;
begin
for i:=1 to b[0] do
begin
b[i]:=b[i]-a[i];
if (b[i]<0) then
begin
dec(b[i+1]);
inc(b[i],CARRYNUM);
end;
end;
while ((b[0]>0) and (b[b[0]]=0)) do dec(b[0]);
end;
procedure multi2;
var i:longint;
begin
for i:=1 to a[0] do
begin
a[i]:=a[i]*2;
if (a[i]>=CARRYNUM) then
begin
inc(a[i+1]);
dec(a[i],CARRYNUM);
end;
end;
if (a[a[0]+1]>0) then inc(a[0]);
end;
procedure gcd;
var sum2,i,tmp:longint;
begin
sum2:=0;
while not(odd(a[1]) or odd(b[1])) do
begin
inc(sum2);
adiv2;
bdiv2;
end;
while true do
begin
while not odd(a[1]) do adiv2;
while not odd(b[1]) do bdiv2;
tmp:=cmp;
case tmp of
{FUNCTION CMP:
0 - A=B; 1 - A>B; 2 - A<B;}
0:break;
1:asubb;
2:bsuba;
end;
end;
for i:=1 to sum2 do multi2;
end;
procedure print;
var i,j:longint;
begin
write(a[a[0]]);
for i:=a[0]-1 downto 1 do
begin
for j:=1 to FPALEN do
if (a[i]<FPA[j]) then write(0)
else break;
write(a[i]);
end;
writeln;
end;
begin
innum;
gcd;
print;
end.
```
by CaptainSlow @ 2017-10-30 10:40:06