小计算器

小计算器

问题描述:

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

  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

思路:

大模拟题,没什么难得就是要写的东西比较多,过程中错了好多次,不是落下这个就是写错那个。。。。。

/************************************************
* @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;
}
posted @ 2020-03-21 13:52  落水清心  阅读(262)  评论(0编辑  收藏  举报