题目: 传送门
思路: 用字符串读入数字,运算全部转成10进制,最后结果转会k进制就行了
注意:
- 题目运算过程出现的数非负,且小于2^63,所以要用long long
- 读入数字和输出结果都要注意对数位上大于10的数用对应的字母替换
- 注意当答案为0情况
Code:
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<stack>
#include<string>
#include<queue>
#include<algorithm>
typedef long long ll;
using namespace std;
int n;
ll a, b;
int k = 10;//当前是k进制
ll k_to_ten(string& x) {//把按字符串读入的数字转成k进制数
ll sum = 0;
ll t = 1;
for (int i=x.length()-1;i>=0;i--) {
if (x[i] >= '0' && x[i] <= '9') {
sum += t * (x[i] - '0');
} else if (x[i] >= 'A' && x[i] <= 'Z') {
sum += t * (x[i] - 'A' + 10);
}
t *= k;
}
return sum;
}
void print_ans(ll x) {//把十进制的答案转成k进制
if (x == 0) {
cout<<0<<endl;
return;
}
stack<ll> st;
while (x > 0) {
st.push(x % k);
x /= k;
}
while (!st.empty()) {
if (st.top() >=10) {
cout<<(char)(st.top() - 10 + 'A');
} else {
cout<<st.top();
}
st.pop();
}
cout<<endl;
}
int main()
{
string op, num;//op:操作 num:数字
int opop;// + - * / % 五选一
cin>>n;
while (n--) {
cin>>op;
if (op == "CLEAR") {
a = b = -1;
} else if (op == "NUM") {
if (a == -1) {//
cin>>num;
a = k_to_ten(num);
} else {
cin>>num;
b = k_to_ten(num);
switch (opop) {
case 1:
a+=b;break;
case 2:
a-=b;break;
case 3:
a*=b;break;
case 4:
a/=b;break;
case 5:
a%=b;break;
}
}
//以下五个运算先保存,不急着计算,等到读入第二个数时再计算
} else if (op == "CHANGE") {
cin>>k;
} else if (op == "EQUAL") {
print_ans(a);
} else if (op == "ADD") {
opop = 1;
} else if (op == "SUB") {
opop = 2;
} else if (op == "DIV") {
opop = 4;
} else if (op == "MUL") {
opop = 3;
} else if (op == "MOD") {
opop = 5;
}
}
return 0;
}