其他分享
首页 > 其他分享> > 试题 历届试题 小计算器

试题 历届试题 小计算器

作者:互联网

试题 历届试题 小计算器

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  模拟程序型计算器,依次输入指令,可能包含的指令有

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

#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define ll long long
ll r = 10;
ll num  = 0;
ll get10(){
    string s;
    cin>>s;
    ll p = 1,m = 0;
    for(int i = s.length()-1;i>=0;i--){
        if(s[i]>'9')m+=(s[i]-'A'+10)*p;//这里是字符9,不是数字9;
        else m += (s[i]-'0')*p;//要呈上进制
        p *= r;
    }
    return m;
}
ll print(){
    string sn;
    ll i = 0,nn = num;
    if(nn == 0)
        sn = "0";
    while(nn){
        char c;
        if(nn%r>9)c = nn%r - 10 + 'A';
        else c = nn%r + '0';//不能用数组直接存,存不进去;
        nn /= r;
    sn = c+sn;
    }
    cout<<sn<<endl;
}
int main()
{
        int n,ope=1;
        string ss;
        cin>>n;
        while(n--)
        {
                cin>>ss;
                if(ss=="CLEAR")
                        num=ope=0;
                else if(ss=="ADD")
                        ope=1;
                else if(ss=="SUB")
                        ope=2;
                else if(ss=="MUL")
                        ope=3;
                else if(ss=="DIV")
                        ope=4;
                else if(ss=="MOD")
                        ope=5;
                else if(ss=="CHANGE")
                        cin>>r;
                else if(ss=="NUM"){
                        switch(ope){//switch函数里面是数字,不能是字符
                                case 0:num=get10();break;//清零后的操作一定要有
                                case 1:num+=get10();break;
                                case 2:num-=get10();break;
                                case 3:num*=get10();break;
                                case 4:num/=get10();break;
                                case 5:num%=get10();break;
                        }
                }
                else if(ss=="EQUAL")
                        print();//转为r进制输出
        }
        return 0;
}

标签:num,试题,ss,ll,else,指令,计算器,历届,进制
来源: https://blog.csdn.net/qq_40939374/article/details/114479469