问题描述
模拟程序型计算器,依次输入指令,可能包含的指令有
1. 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个当前进制的数
2. 运算指令:'ADD','SUB','MUL','DIV','MOD',分别表示加减乘,除法取商,除法取余
3. 进制转换指令:'CHANGE K',将当前进制转换为K进制(2≤K≤36)
4. 输出指令:'EQUAL',以当前进制输出结果
5. 重置指令:'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
题解:模拟题对于进制转化只需要记录现在的进制状态,对于输入的全部转化为10进制的形式进行计算,在输出的时候在转化回来就好了。
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<functional>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int maxnn = 10000 + 2;
const int minn = 100;
const double eps = 1e-6;
string toAns(ll n, int ne)//10进制转化为任意进制
{
if (n == 0)return "0";
string str;
while (n)
{
int tm = n % ne;
if (tm <= 9) { str += '0' + tm; }
else { str += 'A' + tm - 10; }
n /= ne;
}
reverse(str.begin(), str.end());
return str;
}
ll toTen(string str, int ne)//任意进制转化为10进制
{
ll ans = 0, arg = 1;
for (int i = str.size() - 1; i >= 0; --i)
{
if (str[i] <= '9') { ans += (str[i] - '0')*arg; }
else { ans += (str[i] - 'A' + 10)*arg; }
arg *= ne;
}
return ans;
}
ll getOper(ll a, ll b, string op)
{
if (op == "ADD") { return a + b; }
else if (op == "SUB") { return a - b; }
else if (op == "MUL") { return a * b; }
else if (op == "DIV") { return a / b; }
else { return a % b; }
}
int main()
{
//freopen("input1.txt", "r", stdin);
int n;
while (cin >> n)
{
ll ans = 0;
int ne = 10;
string str, old;
while (n--)
{
cin >> str;
if (str == "CLEAR") { str.clear(); old.clear(); }
else if (str == "EQUAL") { old.clear(); cout<< toAns(ans, ne) << endl; }
else if (str == "CHANGE") { cin >> ne; }
else if (str == "NUM"&&old.empty()) { cin >> str; ans = toTen(str, ne); }
else if (str == "NUM" && !old.empty())
{
cin >> str; ans = getOper(ans, toTen(str, ne), old);
}
else { old = str; }
}
}
return 0;
}