蓝桥杯 历届试题 PREV-55小计算器

蓝桥杯 历届试题 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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值