生活随笔
收集整理的這篇文章主要介紹了
[蓝桥杯][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";
}
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";}}return 0;
}
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的[蓝桥杯][2017年第八届真题]小计算器(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。