Tell me why??????????? WA!!!!!!! Послано Levin 24 июн 2002 22:36 type tnode=array[1..500] of integer; var a,b,c,r:tnode; i,j,k,v,n,tb,tc,tr:integer; ss:string; procedure sub; var i:integer; begin dec(c[1]); i:=1; while c[i]=-1 do begin dec(c[i+1]); c[i]:=9; inc(i); end; if (tc>1)and(c[tc]=0) then dec(tc); end; procedure add; var i:integer; begin inc(c[1]); i:=1; while c[i]=10 do begin inc(c[i+1]); c[i]:=0; inc(i); end; if c[tc+1]>0 then inc(tc); end; function equal(x,y,k:integer):boolean; var i:Integer; begin equal:=false; for i:=0 to k-1 do if c[i+x]<>a[y+i] then exit; equal:=true; end; function check:boolean; begin check:=false; c:=b;tc:=tb; k:=j+1; while k<=n do begin sub; if (tc=1)and(c[1]=0) then exit; if k+tc-1<=n then begin if equal(1,k,tc) then else exit; inc(k,tc); end else begin if equal(1,k,n-k+1) then else exit; k:=n+1; end; end; c:=b;tc:=tb; k:=j-i; while k>0 do begin add; if k-tc+1>0 then begin if equal(1,k-tc+1,tc) then else exit; dec(k,tc); end else begin if equal(tc-k+1,1,k) then else exit; k:=0; end; end; check:=true; end; procedure wish(k:integer); var i:integer; begin if tb>tr then exit; if tb<tr then begin r:=b;tr:=tb;v:=k; exit; end; for i:=tb downto 1 do begin if b[i]>r[i] then exit; if b[i]<r[i] then begin r:=b;tr:=tb;v:=k; exit; end; end; if k<v then v:=k; end; procedure compute; begin if tr=1 then begin tc:=1;c[1]:=r[1]+v; exit; end; fillchar(c,sizeof(c),0); for i:=1 to tr-1 do begin j:=i;k:=i; while j>0 do begin inc(c[k],j mod 10); if c[k]>9 then begin inc(c[k+1]);dec(c[k],10);end; j:=j div 10; inc(k); end; end; if c[k]>0 then tc:=k else tc:=k-1; k:=0; for i:=1 to tc do begin c[i]:=c[i]*9+k; k:=0; while c[i]>9 do begin inc(k); dec(c[i],10); end; end; if k>0 then begin inc(tc);c[tc]:=k;end; j:=tr; dec(r[tr]); while (tr>0)and(r[tr]=0) do dec(tr); for i:=1 to tr do begin inc(c[i],r[i]*j); while c[i]>9 do begin inc(c[i+1]); dec(c[i],10); end; end; i:=tr+1; while c[i]>9 do begin while c[i]>9 do begin inc(c[i+1]); dec(c[i],10); end; inc(i); end; if i>tc then tc:=i; if c[tc]=0 then dec(tc); inc(c[1],v+1); i:=1; while (c[i]>9)or(c[i]<0) do begin while c[i]>9 do begin inc(c[i+1]); dec(c[i],10); end; while c[i]<0 do begin dec(c[i+1]); inc(c[i],10); end; inc(i); end; if i>tc then tc:=i; if c[tc]=0 then dec(tc); end; begin assign(input,''); reset(input); readln(ss); while ss[1]=' ' do delete(ss,1,1); while ss[length(ss)]=' ' do delete(ss,length(ss),1); n:=length(ss); fillchar(a,sizeof(a),0); for i:=1 to n do a[i]:=ord(ss[n+1-i])-48; tr:=500; fillchar(b,sizeof(b),0); for i:=1 to n-1 do begin tb:=i; for j:=n downto n-i+1 do if j<i then break else if a[j]>0 then begin move(a[j-i+1],b[1],i*2); if check then wish(j-n); end; if tr<500 then break; end; if tr=500 then if a[n]=0 then begin tr:=n+1; move(a[1],r[1],n*2); r[tr]:=1; v:=1; end else begin tr:=n; move(a[1],r[1],n*2); v:=0; end; fillchar(c,sizeof(c),0); for i:=n-1 downto 1 do if a[i]>0 then begin tc:=n-i; move(a[i+1],c[1],tc*2); add; if tc>n-i then
Re: Tell me why??????????? WA!!!!!!! > type tnode=array[1..500] of integer; > var a,b,c,r:tnode; > i,j,k,v,n,tb,tc,tr:integer; > ss:string; > > procedure sub; > var i:integer; > begin > dec(c[1]); > i:=1; > while c[i]=-1 do > begin > dec(c[i+1]); > c[i]:=9; > inc(i); > end; > if (tc>1)and(c[tc]=0) then dec(tc); > end; > > procedure add; > var i:integer; > begin > inc(c[1]); > i:=1; > while c[i]=10 do > begin > inc(c[i+1]); > c[i]:=0; > inc(i); > end; > if c[tc+1]>0 then inc(tc); > end; > > function equal(x,y,k:integer):boolean; > var i:Integer; > begin > equal:=false; > for i:=0 to k-1 do > if c[i+x]<>a[y+i] then exit; > equal:=true; > end; > > function check:boolean; > begin > check:=false; > c:=b;tc:=tb; > k:=j+1; > while k<=n do > begin > sub; > if (tc=1)and(c[1]=0) then exit; > if k+tc-1<=n then > begin > if equal(1,k,tc) then else exit; > inc(k,tc); > end else > begin > if equal(1,k,n-k+1) then else exit; > k:=n+1; > end; > end; > > c:=b;tc:=tb; > k:=j-i; > while k>0 do > begin > add; > if k-tc+1>0 then > begin > if equal(1,k-tc+1,tc) then else exit; > dec(k,tc); > end else > begin > if equal(tc-k+1,1,k) then else exit; > k:=0; > end; > end; > check:=true; > end; > > procedure wish(k:integer); > var i:integer; > begin > if tb>tr then exit; > if tb<tr then > begin > r:=b;tr:=tb;v:=k; > exit; > end; > for i:=tb downto 1 do > begin > if b[i]>r[i] then exit; > if b[i]<r[i] then > begin > r:=b;tr:=tb;v:=k; > exit; > end; > end; > if k<v then v:=k; > end; > > procedure compute; > begin > if tr=1 then > begin > tc:=1;c[1]:=r[1]+v; > exit; > end; > > fillchar(c,sizeof(c),0); > for i:=1 to tr-1 do > begin > j:=i;k:=i; > while j>0 do > begin > inc(c[k],j mod 10); > if c[k]>9 then begin inc(c[k+1]);dec(c[k],10);end; > j:=j div 10; > inc(k); > end; > end; > if c[k]>0 then tc:=k else tc:=k-1; > > k:=0; > for i:=1 to tc do > begin > c[i]:=c[i]*9+k; > k:=0; > while c[i]>9 do > begin > inc(k); > dec(c[i],10); > end; > end; > if k>0 then begin inc(tc);c[tc]:=k;end; > > j:=tr; > dec(r[tr]); > while (tr>0)and(r[tr]=0) do dec(tr); > for i:=1 to tr do > begin > inc(c[i],r[i]*j); > while c[i]>9 do > begin > inc(c[i+1]); > dec(c[i],10); > end; > end; > i:=tr+1; > while c[i]>9 do > begin > while c[i]>9 do > begin > Re: Tell me why??????????? WA!!!!!!! Try this text: 99 I think the answer is 169. 86 87 88 8(9 9)0 Your output is 188. |