问题描述
模拟程序型计算器,依次输入指令,可能包含的指令有
- 数字:‘NUM X’,X为一个只包含大写字母和数字的字符串,表示一个当前进制的数
- 运算指令:‘ADD’,‘SUB’,‘MUL’,‘DIV’,‘MOD’,分别表示加减乘,除法取商,除法取余
- 进制转换指令:‘CHANGE K’,将当前进制转换为K进制(2≤K≤36)
- 输出指令:‘EQUAL’,以当前进制输出结果
- 重置指令:‘CLEAR’,清除当前数字
指令按照以下规则给出:
数字,运算指令不会连续给出,进制转换指令,输出指令,重置指令有可能连续给出
运算指令后出现的第一个数字,表示参与运算的数字。且在该运算指令和该数字中间不会出现运算指令和输出指令
重置指令后出现的第一个数字,表示基础值。且在重置指令和第一个数字中间不会出现运算指令和输出指令
进制转换指令可能出现在任何地方
运算过程中中间变量均为非负整数,且小于2^63。
以大写的’A’~'Z’表示10-35
输入格式
第1行:1个n,表示指令数量
第2…n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则
输出格式
依次给出每一次’EQUAL’得到的结果
样例输入
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
样例输出
2040
Note:
模拟题,要注意实际中计算器的使用步骤,当运算出一个结果之后,结果自动成为新的左操作数(num1)。
Code
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string change(unsigned long long num, int radix) {//变成base进制
if (num == 0) return "0";
char buffer[66];
int i = 0;
while (num != 0)
{
int bit = num % radix;
if (bit >= 10) {
buffer[i++] = 'A' + bit - 10;
}
else {
buffer[i++] = '0' + bit;
}
num /= radix;
}
buffer[i] = '\0';
string res(buffer);
reverse(res.begin(), res.end());
return res;
}
unsigned long long toDecimal(const string& num,int radix) {
unsigned long long d = 0;
unsigned long long base = 1;
for (int i = num.size() - 1; i >= 0; i--, base *= radix)
{
int bit;
if (num[i] >= 'A'&&num[i] <= 'Z') {
bit = num[i] - 'A' + 10;
}
else {
bit = num[i] - '0';
}
d += base * bit;
}
return d;
}
unsigned long long calculate(unsigned long long num1, unsigned long long num2, const string& oop) {
unsigned long long result = 0;
if (oop == "ADD") {
result = num1 + num2;
}
else if (oop == "SUB") {
result = num1 - num2;
}
else if (oop == "MUL") {
result = num1 * num2;
}
else if (oop == "DIV") {
result = num1 / num2;
}
else if (oop == "MOD") {
result = num1 % num2;
}
return result;
}
int main() {
int radix = 10;//表示当前进制
bool isNum1 = false, isNum2 = false;//是否有数
unsigned long long num1, num2;//十进制
string op, num;//读入的操作和操作数
string oop = "";//运算指令
int n;
cin >> n;
while (n--)
{
cin >> op;
if (op == "CLEAR") {
isNum1 = false;
isNum2 = false;
}
else if (op == "CHANGE") {
cin >> radix;
}
else if (op == "EQUAL") {
cout << change(num1, radix) << endl;
}
else if (op == "NUM") {//读数
cin >> num;
if (!isNum1) {
isNum1 = true;
num1 = toDecimal(num, radix);
}
else {
isNum2 = true;
num2 = toDecimal(num, radix);
if (oop != "") {
num1 = calculate(num1, num2, oop);
oop = "";
isNum2 = false;
}
}
}
else {//读运算指令
oop = op;
if (isNum2) {
num1 = calculate(num1, num2, oop);
oop = "";
isNum2 = false;
}
}
}
return 0;
}