蓝桥杯 历届试题 小计算器

问题描述
  模拟程序型计算器,依次输入指令,可能包含的指令有

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’表示1035
输入格式
  第1行:1个n,表示指令数量
  第2…n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则
输出格式
  依次给出每一次’EQUAL’得到的结果
样例输入
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
样例输出
2040

解题思路:一个很简单的模拟题,主要思路就是

  1. 不管什么进制在运算时都转换成十进制来进行计算
  2. 只有在输出的时候按照最后一次要求的进制转换成该进制即可。
  3. 注意理解题目,题目中的“ EQUAL”只是用来按照最新一次出现的进制输出最后的数据,运算结果并不清除。
  4. “CLEAR”只是用将结果置为0和开始重新输入,“Clear”操作不会改变当前的进制情况。
#include <iostream>
#include <bits/stdc++.h>
#define ll long long

using namespace std;
ll ans = 0;
string change(int k)///十进制转化成其他进制
{

    string s="";
    ll n = ans;
    char c;
    if( n == 0)
        s = "0";

    while(n){
        int temp = n%k;
        if( temp >= 0 && temp < 10)
            c = temp + '0';
        else
            c = (temp - 10) + 'A';
        n = n/k;
        s = c + s;
    }
        //reverse(ans.begin(),ans.end());

    return s;
}
long long int change_ten(string str,int k)///其他进制转化成十进制
{
    long long int ans = 0,temp;
    int len = str.length();
    for(int i = 0; i < len; i ++){
        if(str[i] >= '0' && str[i] <= '9')
            temp = str[i] - '0';
        else
            temp = 10 + (str[i] - 'A');
        ans = ans * k + temp;
    }
    return ans;
}
int main()
{
    int n;
    int k = 10;
    string str;
    string op;
    long long int op1;
    cin>>n;
    int flag;
    while(n--){
        cin>>str;
        if( str=="CLEAR"){
            flag = 0;
            ans = 0;
        }
        else if( str == "EQUAL"){
            cout<<change(k)<<endl;
        }
        else if(str == "NUM"){
            cin>>op;
            op1 = change_ten(op,k);
            switch(flag){
                case 0: ans = op1; break;
                case 1: ans = ans + op1; break;
                case 2: ans = ans - op1; break;
                case 3: ans = ans * op1; break;
                case 4: ans = ans / op1; break;
                case 5: ans = ans % op1; break;
            }
        }
        else if( str == "CHANGE"){
            cin>>k;
        }
        else if( str == "ADD" ){
            flag = 1;
        }
        else if( str == "SUB"){
            flag = 2;
        }
        else if( str == "MUL"){
            flag = 3;
        }
        else if( str == "DIV"){
            flag = 4;
        }
        else if( str == "MOD"){
            flag = 5;
        }
    }
    return 0;
}
发布了105 篇原创文章 · 获赞 15 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章