标题:小计算器
模拟程序型计算器,依次输入指令,可能包含的指令有
- 数字:‘NUM X’,X为一个只包含大写字母和数字的字符串,表示一个当前进制的数
- 运算指令:‘ADD’,‘SUB’,‘MUL’,‘DIV’,‘MOD’,分别表示加减乘,除法取商,除法取余
- 进制转换指令:‘CHANGE K’,将当前进制转换为K进制(2≤K≤36)
- 输出指令:‘EQUAL’,以当前进制输出结果
- 重置指令:‘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
补充说明:
- n 值范围: 1<= n < 50000
- 初始默认的进制是十进制
6
NUM 100
DIV
NUM 50
MUL
NUM 2
EQUAL
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
解题思路:这道题主要考察的难点也就在进制的转换上,Long中有API可以进行转换:
Long.valueOf(temp[1], hex);将String类型转换为long类型并转换进制。
Long.toString(num[0],hex).toUpperCase();将Long类型转换为String并转换进制。
本以为是一道简单题,可坑真的多。
这道题的坑(都是泪):
1、clear并不会清空进制,即进制除非输出最终结果,一直有效。
2、最后输出转进制要注意大写,默认为小写,需要转换为大写
3、java输入要用BufferRenderAPI用Scanner会超时。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static String op="";
static int hex=10;
static String[] temp=new String[2];
static long[] num=new long[2];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bufferedReader.readLine());
for (int i = 0; i < n; i++) {
String[] tmp = bufferedReader.readLine().split(" ");
Panduan(tmp);
// System.out.printf("laji"); }
}
}
//判断
public static void Panduan(String[] temp) {
switch(temp[0]){
case "NUM":
if(op.equalsIgnoreCase(""))
num[0]=Long.valueOf(temp[1], hex);
else {
num[1]=Long.valueOf(temp[1],hex);
num[0]=Jisuan();
op="";
}
//System.out.println(1);
break;
case "CHANGE":
//System.out.println(2);
hex=Integer.parseInt(temp[1]);
break;
case "EQUAL":
//System.out.println(3);
System.out.println(Long.toString(num[0],hex).toUpperCase());//这里注意要转成大写。默认是小写
break;
case "CLEAR":
//System.out.println(4);
num[0]=0;
num[1]=0;
op="";
//hex=10;
break;
case "ADD":
//System.out.println(5);
op="ADD";
break;
case "SUB":
op="SUB";
break;
case "MUL":
op="MUL";
break;
case "DIV":
op="DIV";
break;
case "MOD":
op="MOD";
break;
default:
//System.out.println(6);
break;
}
// System.out.println("asdasdas");
}
//计算
public static long Jisuan() {
switch(op) {
case "ADD":
return num[0]+num[1];
case "SUB":
return num[0]-num[1];
case "MUL":
return num[0]*num[1];
case "DIV":
return num[0]/num[1];
case "MOD":
return num[0]%num[1];
}
return 0;
}
}