Nguồn đề bài http://vn.spoj.com/problems/EXPAR/
1. Đề bài EXPAR spoj
Cho biểu thức số học chỉ chứa hai biến x, y, các hằng số và các phép toán +,−,×. Hãy xác định tính chẵn – lẻ của kết quả biểu thức dựa trên tính chẵn – lẻ của hai biến x, y.
Input
Dòng 1: xâu S có độ dài không quá 106 chỉ gồm các kí tự chữ số, chữ cái ′x′, ′y′ và các dấu phép toán +,−,∗. Xâu S đảm bảo là biểu thức toán học hợp lệ, các hằng số đều là số nguyên không âm và không có chữ số vô nghĩa.
Dòng 2,3: mỗi dòng ghi xâu ′Odd′ hay ′Even’ chỉ tính lẻ hay chẵn của tương ứng biến x và y.
Output
Ghi xâu ′Odd′ hay ′Even’ là kết quả của bài toán.
Example
Input:
x-y*2
Odd
Odd
Output:
Odd
2. Hướng dẫn EXPAR spoj
sử dụng kí pháp Balan để giải quyết bài toán, bên cạnh đó chuyển những số quá lớn trở thành số nhỏ để dễ dàng lưu trữ hơn. Dù số có lớn đến đâu nhưng tính chẳn lẽ của nó thì vẫn ko thay đổi, vì thế bạn chỉ cần chuyển số chẳn lớn thành số 2 và số lẻ lớn thành số 1 và dùng kí pháp balan là được.
3. Code tham khảo EXPAR spoj
[sociallocker]
const fi=''; nmax=1000010; type data=longint; data1=shortint; var f:text; S:ansistring; n:data; v:array[0..nmax+1] of data1; c:array[0..nmax+1] of char; ic,iv:data; procedure docfile; var i,dau,r:data; c:ansistring; k:string; tmp:ansistring; x,y:char; begin assign(f,fi); reset(f); readln(f,c); readln(f,k); if k='Odd' then x:='1' else x:='2'; readln(f,k); if k='Odd' then y:='1' else y:='2'; close(f); i:=1; n:=length(c); s:=''; c:=c+' '; while i<=n do if c[i] in ['0'..'9'] then begin dau:=i; while c[i+1] in ['0'..'9'] do inc(i); tmp:=copy(c,dau,i-dau+1); if tmp='0' then s:=s+'0' else if (ord(tmp[length(tmp)])-48) mod 2=0 then s:=s+'2' else s:=s+'1'; inc(i); end else begin s:=s+c[i]; inc(i); end; n:=length(s); for i:=1 to n do if s[i]='x' then s[i]:=x else if s[i]='y' then s[i]:=y; end; procedure themC(ch:char); begin inc(ic); C[ic]:=ch; end; procedure themv(x:data1); begin inc(iv); v[iv]:=x; end; function xemc:char; begin exit(c[ic]); end; function xemv:data1; begin exit(v[iv]); end; function bac(x:char):data; begin if x='*' then exit(2) else if x in ['+','-'] then exit(1); exit(0); end; function layV:data1; begin layv:=v[iv]; dec(iv); end; procedure layc; begin dec(ic); end; procedure tinh(x:char); var a,b:data1; begin b:=layv; a:=layv; case x of '+': themv(a+b); '-': themv(a-b); '*': themv(a*b); end; if v[iv] <> 0 then if v[iv] mod 2=0 then V[iv]:=2 else v[iv]:=1; end; procedure xulitinh(ch:char); begin while bac(ch)<=bac(xemc) do begin tinh(xemc); layc; end; themc(ch); end; procedure xuli; var i,j:data; begin iv:=0; ic:=0; for i:=1 to n do begin if s[i] in ['0'..'2'] then themV(ord(s[i])-48) else xulitinh(s[i]); end; while ic<>0 do begin tinh(xemc); layc; end; if v[iv] mod 2 = 0 then writeln('Even') else writeln('Odd'); end; begin docfile; xuli; end.
[/sociallocker]