欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【栈】C037_LQ_小计算器(不用栈)

程序员文章站 2022-06-08 22:21:46
...

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

  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'表示10~35

[输入格式]
第1行:1个n,表示指令数量
第2…n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则

[输出格式]
依次给出每一次’EQUAL’得到的结果

[样例输入]
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL

[样例输出]
2040

补充说明:

  1. n 值范围: 1<= n < 50000
  2. 初始默认的进制是十进制
方法一:模拟

import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
    static class Solution {
        final static String Num="NUM", Clear="CLEAR", Change="CHANGE", Out="EQUAL";
        final static int ADD=1, SUB=2, MUL=3, DIV=4, MOD=5; 
        int calcType=-1, radix=10;
        long num;
        
        void tryCalc(String o) {
            long other = Long.parseLong(o, radix);  //从radix进制转为十进制
            if (calcType == -1) {
                num=other;
            } else {
                switch(calcType) {
                    case ADD: num+=other; break;
                    case SUB: num-=other; break;
                    case MUL: num*=other; break;
                    case DIV: num/=other; break;
                    case MOD: num%=other; break;
                }
                calcType=-1;
            }
        }
        void init() {
            Scanner sc = new Scanner(new BufferedInputStream(System.in));
            int n=sc.nextInt();
            Map<String, Integer> opmap = new HashMap<>();
            opmap.put("ADD", 1); opmap.put("SUB", 2); opmap.put("MUL", 3); opmap.put("DIV", 4); opmap.put("MOD", 5); 
            sc.nextLine();
            for (int i=0; i<n; i++) {
                String s=sc.nextLine();
                if (s.contains(" ")) {              //有空格
                    String ss[] = s.split(" ");
                    if (ss[0].equals(Num)) {
                        tryCalc(ss[1]);
                    } else if (ss[0].equals(Change)) {  //进制转换
                        radix=Integer.parseInt(ss[1]);
                    }
                } else if (s.equals(Out)) {
                    System.out.println(Long.toString(num, radix));
                } else if (s.equals(Clear)) {
                    num=0;
                } else if (opmap.containsKey(s)) { //运算符
                    calcType = opmap.get(s);
                }
            }
        }
    }
    public static void main(String[] args) throws IOException {  
        Solution s = new Solution();
        s.init();
    }
}

复杂度分析

  • TimeO(n)O(n)
  • SpaceO(n)O(n)
相关标签: #