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; }