问题描述
模拟程序型计算器,依次输入指令,可能包含的指令有
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
可以说样例给的挺恶心。会让人想不到,这玩意要考虑还是不考虑优先级!?最后在测试下是不需要考虑优先级的。直接挨着个的算即可。还有一个点是我进制转换写错了(竟然’A’->11,生无可恋脸)一直在调这里。。。。其他没啥了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include<iostream> #include<deque> #include<algorithm> #include<cassert> #include<cstdlib> #include<string> using namespace std; int n; int radix = 10; string radixS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; deque<long long> sll; deque<string> sop; long long value; inline long long getCorDecimal(char c) { if ('0' <= c && c <= '9')return c - '0'; if ('A' <= c && c <= 'Z')return c - 'A' + 10; assert(false); return -1; } long long Radix2Decimal(string s) { reverse(s.begin(), s.end()); long long cntBase = 1, result = 0; for (int i = 0; i<s.size(); i++) { result += getCorDecimal(s[i])*cntBase; cntBase *= radix; } return result; } string Decimal2Radix(long long v) { string s = ""; while (v) { s.push_back(radixS[v%radix]); v /= radix; } if (s == "")s = "0"; reverse(s.begin(), s.end()); return s; } bool calculate4Back() { if (sop.empty())return false; string & comm = sop.back(); if (comm == "ADD")value += sll.back(); else if (comm == "SUB")value = sll.back() - value; else if (comm == "MUL")value *= sll.back(); else if (comm == "DIV")value = sll.back() / value; else if (comm == "MOD")value = sll.back() % value; else assert(false); sop.pop_back(); sll.pop_back(); sll.push_back(value); return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { string comm, radixV; cin >> comm; if (comm == "NUM") { cin >> radixV; value = Radix2Decimal(radixV); if (!calculate4Back())sll.push_back(value); //cout<<Decimal2Radix(sll.front())<<endl; } else if (comm == "ADD" || comm == "SUB" || comm == "MUL" || comm == "DIV" || comm == "MOD") { sop.push_back(comm); } else if (comm == "CHANGE") { cin >> radix; } else if (comm == "EQUAL") { cout << Decimal2Radix(sll.front()) << endl; } else if (comm == "CLEAR") { sll.clear(); sop.clear(); } } } |