题目链接
思路:模拟题。注意计算过程始终用十进制来保存结果,输出时再将结果转换为k进制。
有一个坑,后面大概7题,计算结果有多处0。
#include <bits/stdc++.h> using namespace std; map<char,int>mp; map<int,char>mpc; long long k_to_o(int k,string str) { long long ans=0; for(int i=0;i<str.size();i++) { ans=ans*k+mp[str[i]]; } return ans; } string o_to_k(int k,long long ans) { string str=""; while(ans) { str=mpc[ans%k]+str; ans/=k; } if(str.size()==0) str="0"; return str; } long long oper(long long ans,long long str,string op) { if(op=="ADD") return ans+str; else if(op=="SUB") return ans-str; else if(op=="MUL") return ans*str; else if(op=="DIV") return ans/str; else if(op=="MOD") return ans%str; } int main() { for(int i=0;i<10;i++) { mp[i+'0']=i; mpc[i]=i+'0'; } for(int i=0;i<26;i++) { mp['A'+i]=10+i; mpc[10+i]='A'+i; } string str,op="ADD"; long long ans=0,x; int n,k=10; cin>>n; getchar(); while(n--) { getline(cin,str); if(str=="CLEAR") { op="ADD"; ans=0; } else if(str=="EQUAL") { cout<<o_to_k(k,ans)<<endl; } else if(str.size()==3) op=str; else if(str.find("CHANGE")!=string::npos) { str=str.substr(7); k=0; for(int i=0;i<str.size();i++) k = k*10+mp[str[i]]; } else if(str.find("NUM")!=string::npos) { x=k_to_o(k,str.substr(4)); ans = oper(ans,x,op); } } return 0; }