题意:传送门
题解:模拟,对于清空操作,只有数字和运算清空了,但是进制却没有动,主要在于X进制转为10进制,10进制转为X进制,也是比较好写的一个模拟。
#include<bits/stdc++.h>
using namespace std;
long long DCHANGE(string s, int x)
{
long long sum=0;
for(int i=0;i<s.size();i++){
if(s[i]=='-')continue;
if(s[i]>='0'&&s[i]<='9')sum=sum*x+s[i]-'0';
else sum=sum*x+s[i]-'A'+10;
}
if(s[0]=='-')return -1*sum;
return sum;
}
string RCHANGE(long long sum, int y)
{
string res="";
while(sum){
char tmp=sum%y;
sum/=y;
if(tmp<=9)tmp+='0';
else tmp=tmp-10+'A';
res=tmp+res;
}
if(res.size()==0)res="0";
return res;
}
struct Calculator
{
int Ary;
string num;
Calculator() { Ary=10; }
void NUM(string s) { num = s; }
void CHANGE(int k) {
num = RCHANGE(DCHANGE(num, Ary), k);
Ary = k;
}
void ADD(string s) {
long long sum = DCHANGE(num, Ary) + DCHANGE(s, Ary);
num = RCHANGE(sum, Ary);
}
void SUB(string s) {
long long sum = DCHANGE(num, Ary) - DCHANGE(s, Ary);
num = RCHANGE(sum, Ary);
}
void MUL(string s) {
long long sum = DCHANGE(num, Ary) * DCHANGE(s, Ary);
num = RCHANGE(sum, Ary);
}
void DIV(string s) {
long long sum = DCHANGE(num, Ary) / DCHANGE(s, Ary);
num = RCHANGE(sum, Ary);
}
void MOD(string s) {
long long sum = DCHANGE(num, Ary) % DCHANGE(s, Ary);
num = RCHANGE(sum, Ary);
}
void EQUAL() { cout << num << endl; }
void CLEAR() { num.clear();}
};
int main()
{
int N;
cin >> N;
Calculator ST;
int flag;
for(int i=0;i<N;i++){
int t;
string s,st;
cin >> s;
if (s == "CLEAR"){
ST.CLEAR();
flag = 0;
}else if (s == "NUM"){
cin >> st;
switch(flag)
{
case 0:ST.NUM(st);break;
case 1:ST.ADD(st);break;
case 2:ST.SUB(st);break;
case 3:ST.MUL(st);break;
case 4:ST.DIV(st);break;
case 5:ST.MOD(st);break;
}
}else if (s == "CHANGE"){
cin >> t;
ST.CHANGE(t);
}
else if (s == "ADD")
flag = 1;
else if (s == "SUB")
flag = 2;
else if (s == "MUL")
flag = 3;
else if (s == "DIV")
flag = 4;
else if (s == "MOD")
flag = 5;
else if (s == "EQUAL")
ST.EQUAL();
}
return 0;
}