NC220742. 这叒是一道水题
描述
模拟程序型计算器,依次输入指令,可能包含的指令有
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'得到的结果
示例1
输入:
7 CLEAR NUM 1024 CHANGE 2 ADD NUM 100000 CHANGE 8 EQUAL
输出:
2040
C++ 解法, 执行用时: 38ms, 内存消耗: 452K, 提交时间: 2023-08-12 11:24:39
#include<bits/stdc++.h> 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) { 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) { 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() { 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; }