hướng dẫn EXPAR – spoj
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 ...
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]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | 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]