日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[蓝桥杯][2017年第八届真题]小计算器(模拟)

發布時間:2023/12/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [蓝桥杯][2017年第八届真题]小计算器(模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

模擬程序型計算器,依次輸入指令,可能包含的指令有

  • 數字:‘NUM X’,X為一個只包含大寫字母和數字的字符串,表示一個當前進制的數
  • 運算指令:‘ADD’,‘SUB’,‘MUL’,‘DIV’,‘MOD’,分別表示加減乘,除法取商,除法取余
  • 進制轉換指令:‘CHANGE K’,將當前進制轉換為K進制(2≤K≤36)
  • 輸出指令:‘EQUAL’,以當前進制輸出結果
  • 重置指令:‘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
    思路:這個題沒什么難的,就是一個模擬。而且Dotcpp上的數據,水的不能再水了。大家還是去藍橋官網提交看看。在進制轉化的時候,就是先轉化成10進制,再轉化成k進制即可。
    說一下坑點:
    ①CLEAR之后,進制是不會改變的。和之前的一樣。
    ②每次改變進制之后,需要改變當前值,改成這個進制下的表示方法。
    ③由十進制轉k進制的時候,如果是0的話,需要格外的注意。
    代碼如下:

    #include<bits/stdc++.h> #define ll long long using namespace std;const int maxx=1e5+100; char str[maxx]; int n;inline int get_jz(string s) {int sum=0;for(int i=7;i<s.length();i++) sum=sum*10+(s[i]-'0');return sum; } inline void get_num(int jz,string s,string &sum,int mk) {ll sum1=0,sum2=0;ll t=0;for(int i=0;i<sum.length();i++) {if(sum[i]>='0'&&sum[i]<='9') t=sum[i]-'0';else t=sum[i]-'A'+10;sum1=sum1*jz+t;}for(int i=4;i<s.length();i++) {if(s[i]>='0'&&s[i]<='9') t=s[i]-'0';else t=s[i]-'A'+10;sum2=sum2*jz+t;}ll sum3=0;if(mk==-1) sum3=sum2;else if(mk==1) sum3=sum1+sum2;else if(mk==2) sum3=sum1-sum2;else if(mk==3) sum3=sum1*sum2;else if(mk==4) sum3=sum1/sum2;else sum3=sum1%sum2;sum="";while(sum3){int t=sum3%jz;if(t>=0&&t<=9) sum=(char)(t+'0')+sum;else sum=(char)(t-10+'A')+sum;sum3/=jz;}if(sum=="") sum+="0";//這樣處理之后,如果字符串為空的話,就只有0這種情況。 } int main() {scanf("%d",&n);int jz=10,mk=-1;string sum,s;getchar();while(n--){gets(str);s="";for(int i=0;str[i]!='\0';i++) s+=str[i];if(s=="EQUAL") cout<<sum<<endl;else if(s=="CLEAR") sum="",mk=-1;else if(s.find("NUM")!=-1) get_num(jz,s,sum,mk);else if(s=="ADD") mk=1;else if(s=="SUB") mk=2;else if(s=="MUL") mk=3;else if(s=="DIV") mk=4;else if(s=="MOD") mk=5;else if(s.find("CHANGE")!=-1) {ll sum1=0;ll t;int flag=0;if(sum=="") flag=0;else flag=1;for(int i=0;i<sum.length();i++) {flag=1;if(sum[i]>='0'&&sum[i]<='9') t=sum[i]-'0';else t=sum[i]-'A'+10;sum1=sum1*jz+t;}jz=get_jz(s);sum="";while(sum1){t=sum1%jz;if(t>=0&&t<=9) sum=(char)(t+'0')+sum;else sum=(char)(t-10+'A')+sum;sum1/=jz;}if(flag&&sum=="") sum+="0";//這個就代表著sum=="0"的情況。}//cout<<sum<<endl;}return 0; }

    努力加油a啊,(o)/~

    總結

    以上是生活随笔為你收集整理的[蓝桥杯][2017年第八届真题]小计算器(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。