蓝桥杯-历届试题-小计算器-java实现

10 篇文章 0 订阅

题目描述

模拟程序型计算器,依次输入指令,可能包含的指令有

  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

这道题有几个点需要大家注意一下:

1. “运算过程中中间变量均为非负整数,且小于2^63。” 由于int的范围是-2^31 ~ 2^31-1,因此这道题必须使用long来做

2. 运算指令后出现的第一个数字,表示参与运算的数字"。这句话说明,式子按从左到右来运算,不受运算符的优先级而影响顺序。比如计算 2+3X4,按四则运算会先运算3X4=12,再算2+12。但题目中是先算2+3=6,再计算6X4=24。

3.这道题主要考察进制转换,Java提供的api可以进行十进制和其他进制的任意转换。

Long valueOf(String s, int radix):

当前字符串以radix进制,转换为10进制的整数

String toString(long i, int radix) :

将当前10进制的数值i 转换为radix进制的字符串

思路详解:

遍历当前指令:

  1. 指令为 NUM 则将当前数值转换为10进制存入到num[]数组中:
    1.1) 如果当前数是运算符后一个数 则开始运算 并将保存当前运算结果
    1.2) 如果当前数是运算符前一个数 则保存当前数
  2. 指令为 CHANGE 则改变当前hex进制
  3. 指令为 ADD | SUB | MUL | DIV | MOD:保存当前运算符
  4. 指令为EQUAL 以当前hex进制输出数

代码详解:

package oj.T1;

import java.util.*;

/**
 *  遍历当前指令:
 *  1) 指令为 NUM 则将当前数值转换为10进制存入到num[]数组中:
 *      1.1) 如果当前数是运算符后一个数 则开始运算 并将保存当前运算结果
 *      1.2) 如果当前数是运算符前一个数 则保存当前数
 *  2) 指令为 CHANGE 则改变当前hex进制
 *  3) 指令为 ADD | SUB | MUL | DIV | MOD:保存当前运算符
 *  4) 指令为EQUAL 以当前hex进制输出数
 */
public class Cal {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Solution1 sl = new Solution1();
        int n = sc.nextInt();
        sc.nextLine();
        String[] instructions = new String[n];
        for(int i=0;i<n;i++)
            instructions[i] = sc.nextLine();
        sl.f(instructions);
    }

}

class Solution1{

    long[] num = new long[2];//运算数
    String oper = "";//当前运算符
    int hex = 10;//当前进制

    public void f(String[] instructions){
        if(instructions==null || instructions.length==0)
            return;
        int len = instructions.length;
        for(int i=0;i<len;i++){
            String[] instruc = instructions[i].split(" ");
            if(instruc[0].equals("NUM")){
                if(oper.equals(""))
                    //以当前进制存放该数
                    num[0] = Long.valueOf(instruc[1],hex);
                else{
                    //将计算结果保存在num[0]中 运算符重置
                    num[1] = Long.valueOf(instruc[1],hex);
                    num[0] = cal();
                    oper = "";
                }
            }else if(instruc[0].equals("CHANGE")){
                hex = Integer.parseInt(instruc[1]);
            }else if(instruc[0].equals("EQUAL")){
                System.out.println(Long.toString(num[0],hex).toUpperCase());
            }else if(instruc[0].equals("CLEAR")){
                //当前数值全部清零
                num[0] = 0;
                num[1] = 0;
                oper = "";
            } else{
                oper = instruc[0];
            }
        }
    }

    public long cal(){
        if(oper.equals("ADD"))
            return num[0] + num[1];
        else if(oper.equals("SUB"))
            return num[0] - num[1];
        else if(oper.equals("MUL"))
            return num[0] * num[1];
        else if(oper.equals("DIV"))
            return num[0] / num[1];
        else
            return num[0] % num[1];
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值