zoukankan      html  css  js  c++  java
  • [蓝桥杯][2017年第八届真题]小计算器(模拟)

    题目描述

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


    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
    思路:把其他进制先转成10进制,最后在转成当前的进制输出
    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<set>
    #include<map>
    #include<vector>
    #include<cmath>
    
    const int maxn=1e5+5;
    typedef long long ll;
    using namespace std;
    
    string st;
    char str[36];
    ll ss;
    void  tochange(int x,int jz)
    {
       char ans[105];
       int cnt=0;
       while(x)
       {
            ans[cnt++]=str[x%jz];
            x/=jz;
       }
       for(int t=cnt-1;t>=0;t--)
       {
           cout<<ans[t];
       }
       cout<<endl;
    }
    ll  cal(char x[],int jz)
    {
        ll sum=0;
        int cnt=0;
        int len=strlen(x);
        for(int t=0;t<len;t++)
        {
            if(x[t]>='0'&&x[t]<='9')
            {
                sum+=(x[t]-'0')*pow(jz,len-1-t);
            }
            else
            {
                sum+=(x[t]-'A'+10)*pow(jz,len-1-t);
            }
        }
        return sum;
    }
    stack<int>op;
    stack<string>oop;
    int main()
    {
        op.push(10);    
        for(int t=0;t<10;t++)
        {
            str[t]='0'+t;
        }
        for(int t=10;t<36;t++)
        {
            str[t]='A'+t-10;
        }
        int n;
        cin>>n;
        char num[105];
        int cc;
        ll xx;
        for(int t=0;t<n;t++)
        {
            cin>>st;
            if(st=="CLEAR")
            {
                ss=0;
            }
            else if(st=="NUM")
            {
                cin>>num;
                xx=cal(num,op.top());
                if(!oop.empty())
                {
                    if(oop.top()=="ADD")
                    {
                        ss+=xx;
                    }
                    else if(oop.top()=="SUB")
                    {
                        ss-=xx;
                    }
                    else if(oop.top()=="MUL")
                    {
                        ss*=xx;
                    }
                    else if(oop.top()=="DIV")
                    {
                        ss/=xx;
                    }
                    else
                    {
                        ss%=xx;
                    }
                    oop.pop();
                }
                else
                {
                    ss=cal(num,op.top());
                }
            }
            else if(st=="CHANGE")
            {
                cin>>cc;
                op.pop();
                op.push(cc);
            }
            else if(st=="EQUAL") 
            {
                tochange(ss,op.top());
            }
            else
            {
                oop.push(st);    
            }
        }
        return 0;
    }
  • 相关阅读:
    C++中的向量学习
    delphi中判断popupmenu的弹出来源....
    在QT4中使用类似QVBox类似功能
    flex控件的学习网站(收藏)
    总结Flash XMLSocket 通信问题
    Fiddle扩展HttpPing批量检测web服务器是否正常
    flex的Socket通讯沙箱和安全策略问题
    .Net平台开源作业调度框架Quartz.Net
    IE6 7 select option设置disabled无效
    Flex值得一看参考资源
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10808990.html
Copyright © 2011-2022 走看看