蓝桥杯试题 历届试题 小计算器(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;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值