ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-07-22

2021-07-22 23:33:28  阅读:176  来源: 互联网

标签:case num 07 22 ai break 指令 2021 change


日常练习

问题描述

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

  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,可以考虑不用实体类。

标签:case,num,07,22,ai,break,指令,2021,change
来源: https://blog.csdn.net/qq_41327605/article/details/119010142

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有