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();
	}
}