小计算器
小计算器
问题描述:
模拟程序型计算器,依次输入指令,可能包含的指令有
- 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个当前进制的数
- 运算指令:'ADD','SUB','MUL','DIV','MOD',分别表示加减乘,除法取商,除法取余
- 进制转换指令:'CHANGE K',将当前进制转换为K进制(2≤K≤36)
- 输出指令:'EQUAL',以当前进制输出结果
- 重置指令:'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
思路:
大模拟题,没什么难得就是要写的东西比较多,过程中错了好多次,不是落下这个就是写错那个。。。。。
/************************************************
* @Author: leaflove
* @Date: 2020-03-21 12:28:50
* @File: calculation.cpp
* @Remark:
************************************************/
#include <bits/stdc++.h>
#define CSE(x,y) memset(x,y,sizeof(x))
#define lowbit(x) (x&(-x))
#define INF 0x3f3f3f3f
#define FAST ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll , ll> pll;
const int maxn = 111111;
class calculation
{
public:
ll num;
int step;
int op;
calculation();
~calculation();
void Clear();
void operate(string opr);
void Get_Num(string nmb);
int Get_Val(char k);
void ChangeStep(int x);
void Equal();
char Get_Char(int x);
};
calculation::calculation(){
num=0,step=10;
op=1;
}
calculation::~calculation(){
num=0,step=10;
op=1;
}
void calculation::Clear(){
num=0;op=1;
return;
}
void calculation::operate(string opr){
if(opr=="ADD")
op=1;
if(opr=="SUB")
op=2;
if(opr=="MUL")
op=3;
if(opr=="DIV")
op=4;
if(opr=="MOD")
op=5;
return;
}
void calculation::Get_Num(string nmb){
int len=nmb.length();
ll val=0;
for(int i=0;i<len;i++){
val=val*step+Get_Val(nmb[i]);
}
switch(op){
case 1: num+=val;break;
case 2: num-=val;break;
case 3: num*=val;break;
case 4: num/=val;break;
case 5: num%=val;break;
default:break;
}
op=0;
return;
}
int calculation::Get_Val(char k){
if(k>='0'&&k<='9')
return k-'0';
else{
return k-'A'+10;
}
}
void calculation::ChangeStep(int x){
step=x;
return;
}
void calculation::Equal(){
ll mid=num;
stack<char> ans;
while(mid){
ans.push(Get_Char(mid%step));
mid/=step;
}
if(ans.empty()){
cout<<"0"<<endl;
return;
}
while(!ans.empty()){
cout<<ans.top();
ans.pop();
}
cout<<endl;
return;
}
char calculation::Get_Char(int x){
if(x>=0&&x<=9)
return '0'+x;
else{
return 'A'+x-10;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
FAST;
int t;
string d,in;
cin>>t;
calculation mem;
while(cin>>d){
if(d=="CLEAR"){
mem.Clear();
}
else if(d=="NUM"){
cin>>in;
mem.Get_Num(in);
}
else if(d=="CHANGE"){
int x;
cin>>x;
mem.ChangeStep(x);
}
else if(d=="EQUAL"){
mem.Equal();
}
else{
mem.operate(d);
}
}
return 0;
}