PREV-55 小计算器

自动机,模拟

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
//将每次输入的数字转化为十进制操作保存,输出前转化为当前进制输出 
//对于自动机形式的题,关键找准运算的顺序和关键节点
//本题以NUM为节点,来对前面存储的字符和数字进行计算 
ll num =0;
ll r = 10;//初始为十进制 
ll get10()//输入相应的数字得到对应十进制值
{
    ll temp_sum=0,p=1; 
    string s;
    cin>>s;
    for(int i = s.length()-1;i>=0;i--){
        if(s[i]>'9'){
            temp_sum+=p*(s[i]-'A'+10);
        }
        else temp_sum+=p*(s[i]-'0');
        p *=r;//按照对应的进制相加 
    }
    return temp_sum;
 } 
 void print()
{
        string s;
        ll nn=num;
        if(nn==0)
                s="0";
        while(nn){
                char c;
                if(nn%r<=9)
                        c=(nn%r)+'0';
                else
                        c=(nn%r-10)+'A';
                nn/=r;
                s=c+s;
        }
        cout<<s<<endl;
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int n,ope =1;
    string ss;
    cin>>n;
    while(n--){
        cin>>ss;//注意cin缓冲区的影响,带空格的会导致下次cin直接读取到
        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"){//以NUM为分界点,计算将之前存储的符号和存储的值num,以及新读入的值做运算 
            switch(ope){
            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;
}

 

posted @ 2021-03-06 21:32  zmachine  阅读(62)  评论(0编辑  收藏  举报