求大神帮忙看错

P2152 [SDOI2009] SuperGCD

太长不看![](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


|