日常练习
问题描述
模拟程序型计算器,依次输入指令,可能包含的指令有
- 数字:‘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
做题思路
用一个变量专门表示当前进制,再抛开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,可以考虑不用实体类。