2021-07-22

日常练习

问题描述

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

  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

做题思路

用一个变量专门表示当前进制,再抛开CLEAR和EQUAL外,接收的基本上是一个操作数一个操作符这样的顺序,用数组存储的话,数组下标为奇数时即是操作符。另外,在向数组存数的时候,直接转化为十进制会更方便。

代码片

public class day12 {
    String num=null;//数
    String caozuo=null;//进行的操作
    long change10num=0;//数的十进制数
}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package lanqiaolianxi;

import java.util.Scanner;

/**
 *
 * 主类必须用Main题目要求
 */
public class Main {
    //转为十进制
    public static long shi(String a,int change){
        char[] str=a.toCharArray();
        int n=a.length(),ichange=1;
        long num = 0;
        for (int i = n-1; i >=0; i--) {
            if (str[i]>='0'&&str[i]<='9') {
                num+=(str[i]-'0')*ichange;
            }else{
                num+=(str[i]-'A'+10)*ichange;
            }
            ichange*=change;
        }
        return num;
    }
    //十进制转x进制
    public static String xchange(long a,int change){
        String num="";
        while (a!=0) {            
            if (a%change>=0&&a%change<=9) {
                num=String.valueOf(a%change)+num;
            }else{
                num=a%change-10+'A'+num;
            }
            a/=change;
        }
        return num;
    }
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();//指令数
        day12[] a=new day12[n];//存指令的数组
        int ai=-1;//代替数组的指针
        int change=10;//表示下一个接收的数的进制
        if (scan.next().equals("CLEAR")) {
            for (int i = 1; i < n; i++) {//接收指令
                String str=scan.next();
                switch (str){
                    case "NUM":
                        a[++ai]=new day12();
                        a[ai].num=scan.next();
                        break;
                    case "CHANGE": 
                        a[ai].change10num=shi(a[ai].num,change);
                        change=scan.nextInt(); 
                        break;
                    case"ADD":a[++ai]=new day12();a[ai].caozuo="ADD";break;
                    case"SUB":a[++ai]=new day12();a[ai].caozuo="SUB";break;
                    case"MUL":a[++ai]=new day12();a[ai].caozuo="MUL";break;
                    case"DIV":a[++ai]=new day12();a[ai].caozuo="DIV";break;
                    case"MOD":a[++ai]=new day12();a[ai].caozuo="MOD";break;
                    case"EQUAL":a[++ai]=new day12();a[ai].caozuo="EQUAL";break;
                    case"CLEAR"://清除当前数字,指针回退一位表示清除,当指针再次指向当前位置会被覆盖
                        if (ai!=-1) {
                            ai--;
                        }break;
                }
            }
            for (int i = 1; i <= ai; i+=2) {//计算并输出
                switch (a[i].caozuo){
                    case"ADD":
                        a[i+1].change10num+=a[i-1].change10num;
                        break;
                    case"SUB":a[i+1].change10num-=a[i-1].change10num;break;
                    case"MUL":a[i+1].change10num*=a[i-1].change10num;break;
                    case"DIV":a[i+1].change10num/=a[i-1].change10num;break;
                    case"MOD":a[i+1].change10num%=a[i-1].change10num;break;
                    case"EQUAL":
                        System.out.println(xchange(a[i-1].change10num,change));//把结果改成最后一次进制格式
                        break;
                }
            }
        }
    }
}

感觉还可以优化,数和操作数都是String,可以考虑不用实体类。

上一篇:vue中关于v-model和:model的理解


下一篇:[eJOI2019]异或橙子 题解