问题描述
模拟程序型计算器,依次输入指令,可能包含的指令有
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
-----------------------------------------------------------
最主要的是进制转换。
static String change(String s,int a,int b) { //进制转换
return new BigInteger(s,a).toString(b);
// return Integer.parseInt(new BigInteger(s,a).toString(b));
}
整了又整,还是有错。
这篇是借鉴的。蓝桥杯 历届试题 小计算器(Java)
根据他的代码,我修改了我的。
package t2;
import java.math.BigInteger;
import java.util.Scanner;
public class JiSuanQi_2 {
static int JinZhi = 10; //进制
static String begin = "0"; //起始值
static String op = ""; //运算符
static String change(String s,int a,int b) { //进制转换
return new BigInteger(s,a).toString(b);
// return Integer.parseInt(new BigInteger(s,a).toString(b));
}
static long operate(long f,long s) {
long sum = 0;
switch(op) {
case "ADD":
sum = f+s;
break;
case "SUB":
sum = f-s;
break;
case "MUL":
sum = f*s;
break;
case "DIV":
sum = f/s;
break;
case "MOD":
sum = f%s;
break;
}
return sum;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int sum = cin.nextInt();
String[] sss = new String[sum+1];
for(int i=0;i<=sum;i++) {
sss[i] = cin.nextLine();
String[] num = sss[i].split(" ");
// String[] num = cin.nextLine().split(" ");
switch(num[0]) {
case "NUM":
if(begin.equals("0")) {
begin =num[1];
}
else {
long first = new BigInteger(change(begin,JinZhi,10)).longValue();
long second = new BigInteger(change(num[1],JinZhi,10)).longValue();
begin = change(operate(first,second)+"",10,JinZhi);
}
break;
case "ADD":
op = "ADD";
break;
case "SUB":
op = "SUB";
break;
case "MUL":
op = "MUL";
break;
case "DIV":
op = "DIV";
break;
case "MOD":
op = "MOD";
break;
case "CHANGE":
begin = change(begin,JinZhi,Integer.parseInt(num[1]));
JinZhi = Integer.parseInt(num[1]);
break;
case "EQUAL":
System.out.println(begin);
break;
case "CLEAR":
begin = "0";
break;
}
}
cin.close();
}
}
只有10分啊,我也不知道错哪了,有点烦。
我第一遍太麻烦,用了很多subString,看起来很麻烦。吸取经验后,换成了split,并且加入了switch-case,这个我其实并不常用,所以没想起来。
第一遍的代码。这就是黑历史。。。
package t2;
import java.math.BigInteger;
import java.util.Scanner;
public class JiSuanQi {
static long change(String s,int a,int b) {
// return new BigInteger(s,a).toString(b);
return Integer.parseInt(new BigInteger(s,a).toString(b));
}
class Op{
long a;
long b;
public Op(long a, long b) {
this.a = a;
this.b = b;
}
public Op() {}
public long getA() {
return a;
}
public void setA(long a) {
this.a = a;
}
public long getB() {
return b;
}
public void setB(long b) {
this.b = b;
}
public long Add() {
return a+b;
}
public long Sub() {
return a-b;
}
public long Mul() {
return a*b;
}
public long Div() {
return a/b;
}
public long Mod() {
return a%b;
}
}
static long num(String s) {
return Integer.parseInt(s.substring(4));
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int sum = cin.nextInt();
int JinZhi = 10;
long begin = 0;
// long n = 0;
String[] sss = new String[sum+2];
for(int i=1;i<=sum;i++) {
sss[i] = cin.next();
}
int m = 0;
for(int i=1;i<=sum;i++) {
while(sss[i].substring(0,2).equals("NUM")) {
m = i;
begin = Integer.parseInt(sss[i].substring(4));
}
if(m!=0)
break;
}
for(int i=2;i<=sum;i++) {
if(sss[i].equals("CLEAR")||sss[i].equals("EQUAL")) {
if(sss[i].equals("CLEAR")) {
begin = 0;
}
if(sss[i].equals("EQUAL")) {
System.out.println("最终结果"+begin);
}
}
else {
if(sss[i].substring(0,5).equals("CHANGE")) {
int k = Integer.parseInt(sss[i].substring(7));
begin = change(sss[i].substring(7),JinZhi,k);
JinZhi =k;
}
else {
String st = sss[i].substring(0,2);
JiSuanQi jsq = new JiSuanQi();
long end = Integer.parseInt(sss[i+1].substring(4));
if(JinZhi != 10) {
String beg = begin+"";
begin = change(beg,JinZhi,10);
end = change(sss[i+1].substring(4),JinZhi,10);
}
Op op = jsq.new Op(begin,end);
if(st.equals("ADD")) {
begin = op.Add();
}
if(st.equals("SUB")) {
begin = op.Sub();
}
if(st.equals("MUL")) {
begin = op.Mul();
}
if(st.equals("DIV")) {
begin = op.Div();
}
if(st.equals("MOD")) {
begin = op.Mod();
}
begin = change(begin+"",10,JinZhi);
}
}
}
cin.close();
}
}
遇到这个错误之后我没再管。
直接搜了别人写的,然后修改。
1. 字符串角标越界异常
2. 数组越界 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
3. 空指针异常 java.lang.NullPointerException出现的几种原因以及解决
4. java.lang.NumberFormatException: For input string: "10000000000"
将String类型转换为Integer类型爆出此异常
将 long second = Integer.parseInt(num[1]);
修改为 long second = new BigInteger(num[1]).longValue();
5. int和integer的区别
6. BufferedReader reader= new BufferedReader(new InputStreamReader(System.in))解读
java中的new BufferedReader(new InputStreamReader(System.in))
7. java8中的default关键字
8. java中的char类型
为什么啊,他为什么要有一个空的???
不懂。