蓝桥杯 历届试题 PREV-55小计算器
资源限制
时间限制: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<cstdio>
#include<cmath>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
long long ch10(string s, int x){
long long num=0;
for(int i = 0; i<s.size(); i++){
num *= x;
if(s[i] >= '0' && s[i] <= '9') num += s[i]-'0';
else num += s[i]-'A'+10;
}
return num;
}//x进制转为十进制
void chk(long long num, int x){
char s[65];
int a, n, i;
for (i = 0; ; i++) {
a = num % x;
if(a < 10) s[i] = a + '0';
else s[i] = a - 10 + 'A';
if(num < x) break;
num /= x;
}
for (; i >= 0; i--) {
printf("%c", s[i]);
}//反序输出
printf("\n");
}//十进制转为x进制(仅在输出时)
int main(int argc, char const *argv[]) {
int n, now = 10, op = 0, flag1 = 1;
string s, a;
long long num1, num2;
scanf("%d", &n);
while (n--) {
cin >> s;
switch(s[0]){
case 'A': op = 1; break;
case 'S': op = 2; break;
case 'M': if(s[1] == 'U') op = 3; else op = 5; break;
case 'D': op = 4; break;
}//读入操作,因为不知道另一个操作数所以先用op保存
if(s[0]=='N') {
cin >> a;
if(flag1 == 1) {//清空后读入的第一个数
num1 = ch10(a,now);
flag1 = 0;
}
else {
num2 = ch10(a,now);//知道第二个数可以进行操作了
switch(op) {
case 1:num1 += num2; break;
case 2:num1 -= num2; break;
case 3:num1 *= num2; break;
case 4:num1 /= num2; break;
case 5:num1 %= num2; break;
}
}
}
if(s[0]=='E') {
chk(num1, now);//输出的时候才将十进制转为当前所需进制
}
if(s[0]=='C') {
if(s[1] == 'L') flag1 = 1;//清空时flag置1
else {
scanf("%d", &now);//不是清空就是改变进制,因为内部存的都是十进制所以记录一下当前进制,输出时按这个进制输出就可以
}
}
}
return 0;
}