藍橋杯試題 歷屆試題 小計算器(Java解法)

這個題主要就是考進制轉換,我試圖自己寫進制轉換解決,可惜只能得三十分,就不在這上面發愁了,這裏直接使用Long類的裝箱和拆箱函數處理進制,這樣做是比較方便的。需要注意的是Long.toString這個拆箱函數輸出時字母是小寫狀態,需要大寫處理。

問題描述

模擬程序型計算器,依次輸入指令,可能包含的指令有

  1. 數字:‘NUM X’,X爲一個只包含大寫字母和數字的字符串,表示一個當前進制的數
  2. 運算指令:‘ADD’,‘SUB’,‘MUL’,‘DIV’,‘MOD’,分別表示加減乘,除法取商,除法取餘
  3. 進制轉換指令:‘CHANGE K’,將當前進制轉換爲K進制(2≤K≤36)
  4. 輸出指令:‘EQUAL’,以當前進制輸出結果
  5. 重置指令:‘CLEAR’,清除當前數字

指令按照以下規則給出:
  數字,運算指令不會連續給出,進制轉換指令,輸出指令,重置指令有可能連續給出
  運算指令後出現的第一個數字,表示參與運算的數字。且在該運算指令和該數字中間不會出現運算指令和輸出指令
  重置指令後出現的第一個數字,表示基礎值。且在重置指令和第一個數字中間不會出現運算指令和輸出指令
  進制轉換指令可能出現在任何地方

運算過程中中間變量均爲非負整數,且小於2^63。
  以大寫的’A’'Z’表示1035

輸入格式

第1行:1個n,表示指令數量
第2…n+1行:每行給出一條指令。指令序列一定以’CLEAR’作爲開始,並且滿足指令規則

輸出格式

依次給出每一次’EQUAL’得到的結果

樣例輸入

7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL

樣例輸出

2040

代碼參考

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	// 當前運算符
	private static String oper = null;
	// 當前的結果
	private static long num = 0;
	// 當前的進制
	private static int radix = 10;
	
	public static void main(String[] args) {
		try {
			run();
		} catch (NumberFormatException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 處理輸入輸出
	 * @throws IOException 
	 * @throws NumberFormatException 
	 */
	public static void run() throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// 指令條數
		int n = Integer.parseInt(br.readLine());
		for (int i = 0; i < n; i++) {
			String temp = br.readLine();
			if (temp.contains(" ")) {
				// 兩個操作符
				String[] ins = temp.split(" ");
				switch (ins[0]) {
				case "NUM":
					if (oper != null) {
						dealOper(Long.valueOf(ins[1], radix));
					}else {
						num = Long.valueOf(ins[1], radix);
					}
					break;
				case "CHANGE":
					radix = Integer.parseInt(ins[1]);
					break;
				default:
					break;
				}
			}else {
				// 一個操作符
				if(temp.equals("EQUAL")) {
					System.out.println(Long.toString(num, radix).toUpperCase());
				}else if(temp.equals("CLEAR")) {
					num = 0;
				}else {
					oper = temp;
				}
			}
		}
	}
	
	/**
	 * 處理運算
	 * @param l
	 */
	private static void dealOper(long l) {
		switch (oper) {
		case "ADD":
			num += l;
			oper = null;
			break;
		case "SUB":
			num -= l;
			oper = null;
			break;
		case "MUL":
			num *= l;
			oper = null;
			break;
		case "DIV":
			num /= l;
			oper = null;
			break;
		case "MOD":
			num %= l;
			oper = null;
			break;
		default:
			break;
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章