您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页蓝桥杯 历届试题 小计算器

蓝桥杯 历届试题 小计算器

来源:保捱科技网

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

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

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

#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;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务