AOJ2435 Zero Division Checker
問題リンク Zero Division Checker
- 解法
スタックに積むのを「整数値」ではなく、「取りうる値の範囲」にすれば解けます。
"/"の演算子が登場してオペランドaとbをpopしたとき、0がbに含まれていると0除算の可能性があることになります。
- ソース
import java.util.HashMap; import java.util.Map; import java.util.Scanner; import java.util.Stack; //Zero Division Checker public class AOJ2435 { class R{ boolean[] p; public R() { p = new boolean[256]; } } void run(){ Scanner sc = new Scanner(System.in); int m = sc.nextInt(); Map<String, Integer> ref = new HashMap<String, Integer>(); int[] lb = new int[m], ub = new int[m]; for(int i=0;i<m;i++){ ref.put(sc.next(), i); lb[i] = sc.nextInt(); ub[i] = sc.nextInt(); } int n = sc.nextInt(); boolean res = true; Stack<R> r = new Stack<R>(); while(n--!=0){ String s = sc.next(); R v = new R(); if(ref.containsKey(s)){ int id = ref.get(s); for(int i=lb[id];i<=ub[id];i++)v.p[i] = true; } else if("/".equals(s)){ R b = r.pop(), a = r.pop(); if(b.p[0]){ res = false; break; } for(int x=0;x<256;x++)if(a.p[x])for(int y=0;y<256;y++)if(b.p[y])v.p[(x/y)%256] = true; } else if("+".equals(s)){ R b = r.pop(), a = r.pop(); for(int x=0;x<256;x++)if(a.p[x])for(int y=0;y<256;y++)if(b.p[y])v.p[(x+y)%256] = true; } else if("-".equals(s)){ R b = r.pop(), a = r.pop(); for(int x=0;x<256;x++)if(a.p[x])for(int y=0;y<256;y++)if(b.p[y])v.p[(x-y+256)%256] = true; } else if("*".equals(s)){ R b = r.pop(), a = r.pop(); for(int x=0;x<256;x++)if(a.p[x])for(int y=0;y<256;y++)if(b.p[y])v.p[(x*y)%256] = true; } else{ v.p[Integer.parseInt(s)] = true; } r.add(v); } System.out.println(res?"correct":"error"); } public static void main(String[] args) { new AOJ2435().run(); } }