zoukankan      html  css  js  c++  java
  • 小计算器

    小计算器

    问题描述:

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

    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;
    }
    
  • 相关阅读:
    dsadsad
    线程池,封装使用,实现控制子线程
    如何能很好地安排好自己的时间?
    中文验证码
    海量数据处理专题(七)——数据库索引及优化
    java tree jtree的使用
    基于Cookie的单点登录(SSO)系统介绍
    急求VS2010的Cookie解决方法
    微软企业库5.0 学习之路系列文章索引
    Net 4.0 Parallel编程(八)Task中的数据共享(中)
  • 原文地址:https://www.cnblogs.com/LeafLove/p/12539061.html
Copyright © 2011-2022 走看看