AOJ2070 First Experience
問題リンク First Experience
- 概要
コンピュータのシミュレータの動きをシミュレートし、演算結果を表示せよ。
シミュレータはR1, R2, R3の3つのレジスタがある。
R1: 最も新しい演算結果が入っている
R2: 最も新しい入力値が入っている
R3: 入力された演算子が入っている
これらの初期値はそれぞれ、0, 0, nullである。
コンピュータには'0'〜'9', '+', '-', '*', '='に対応するキーがある。
'0'〜'9'が押された時: R2が10倍され、入力された数値が足される
'+', '-', '*'が押された時: R1, R2, R3による演算結果が格納される。R3がnullのときはR2の値がそのままR1の値になる。それ以外の場合、R1 [R3] R2 の演算結果がR1の値となる。こののち、R2は0にクリアされ、押されたキーがR3に格納される。
'='が押された時: R1, R2, R3による演算結果が上記と同じルールで適用されたのち、シミュレート結果を表示し、シミュレートを終了する。
しかし、このシミュレータでは、最大4桁までの正の数しか扱うことしかできない。シミュレート中に扱えない値が現れた場合、即座にシミュレートを中止し、"E"と答えよ。
入力では、キー入力のシーケンスSが与えられる。
S | <= 80 |
- 解法
シーケンスを1文字ずつ見ていき、その文字によって、シミュレータの定義通りの動作を実現するだけです。
問題文が読めれば苦労するところは無いんではないでしょうか。
- ソース
import java.util.Scanner; //First Experience public class AOJ2070 { void run(){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ char[] s = sc.next().toCharArray(); int r1 = 0, r2 = 0; char r3 = ' '; boolean f = true; for(int i=0;i<s.length;i++){ if(Character.isDigit(s[i]))r2=r2*10+s[i]-'0'; else { if(r3==' ')r1=r2; else if(r3=='+')r1+=r2; else if(r3=='-')r1-=r2; else r1*=r2; r2 = 0; r3 = s[i]; } if(r1<0||r2<0||10000<=r1||10000<=r2){ f = false; break; } } System.out.println(f?r1:"E"); } } public static void main(String[] args) { new AOJ2070().run(); } }