历届试题 小计算器
时间限制:1.0s 内存限制:256.0MB
问题描述
模拟程序型计算器,依次输入指令,可能包含的指令有
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
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <stack>
#include <cmath>
using namespace std;
char arr[36];
/*
k进制转10进制,便于运算
*/
long long changeToten(string str, int k)
{
long long sum = 0;
long long j = 1;
for (int i = str.length() - 1; i >= 0; i--, j *= k)
{
//ASCII码对应为0-9
if (str[i] >= 48 && str[i] <= 57) {
sum += (str[i] - 48) * j;
}
//ASCII码对应为A-Z
else if (str[i] >= 65 && str[i] <= 90) {
sum += (str[i] - 55) * j;
}
}
return sum;
}
//十进制转化成k进制
string change(long long num, int k)
{
if (num == 0)
return "0";
stack<char> s;
while (num) {
s.push(arr[num%k]);//余数进栈
num = (long long)(num / k);
}
string str;
while (!s.empty()) {
str += s.top();
s.pop();
}
return str;
}
int main()
{
//ofstream outfile;
//outfile.open("./Debug/Text.txt");
for (int i = 0; i < 36; i++) {
if (i < 10) { arr[i] = 48 + i; }
else arr[i] = 'A' + (i - 10);
}
string operation;
string call;//记录最近一次运算符
int t;
bool flag_result = false;//让result只初始化一次
int count = 0;
int nowk = 10;//当前进制,默认为10进制
string num0, num1;
long long num0_ten, num1_ten;
string result;
long long result_ten;
cin >> t;
while (t--)
{
cin >> operation;
if (operation == "CLEAR") {
num0 = "";
num1 = "";
flag_result = false;
call = "";
count = 0;
}
else if (operation == "NUM") {
if (count++ == 0) {
cin >> num0;
num0_ten = changeToten(num0, nowk);
}
else {
cin >> num1;
num1_ten = changeToten(num1, nowk);
}
//初始化result
if (!flag_result) {
result = num0;
result_ten = changeToten(result, nowk);
flag_result = true;
}
//有新的数输入就用前一个运算符进行计算
if (count != 1) {
if (call == "ADD") result_ten += num1_ten;
else if (call == "SUB") result_ten -= num1_ten;
else if (call == "MUL") result_ten *= num1_ten;
else if (call == "DIV") result_ten = (long long)(result_ten / num1_ten);
else if (call == "MOD") result_ten %= num1_ten;
}
}
else if (operation == "CHANGE") {
cin >> nowk;
}
else if (operation == "EQUAL") {
result = change(result_ten, nowk);
cout << result << endl;
//把结果写入文件
//outfile << result << endl;
}
else {
call = operation;
}
}
//outfile.close();
//system("pause");
return 0;
}