這個題主要就是考進制轉換,我試圖自己寫進制轉換解決,可惜只能得三十分,就不在這上面發愁了,這裏直接使用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;
}
}
}