历届试题 小计算器(模拟)

题意:传送门
题解:模拟,对于清空操作,只有数字和运算清空了,但是进制却没有动,主要在于X进制转为10进制,10进制转为X进制,也是比较好写的一个模拟。

#include<bits/stdc++.h>
using namespace std;
long long DCHANGE(string s, int x)
{
	long long sum=0;
	for(int i=0;i<s.size();i++){
        if(s[i]=='-')continue;
        if(s[i]>='0'&&s[i]<='9')sum=sum*x+s[i]-'0';
        else sum=sum*x+s[i]-'A'+10;
	}
	if(s[0]=='-')return -1*sum;
    return sum;
}
string RCHANGE(long long sum, int y)
{
	string res="";
	while(sum){
        char tmp=sum%y;
        sum/=y;
        if(tmp<=9)tmp+='0';
        else tmp=tmp-10+'A';
        res=tmp+res;
	}
	if(res.size()==0)res="0";
	return res;
}
struct Calculator
{
    int Ary;
    string num;
	Calculator() { Ary=10; }
	void NUM(string s) { num = s; }
	void CHANGE(int k) {
		num = RCHANGE(DCHANGE(num, Ary), k);
		Ary = k;
	}
	void ADD(string s) {
		long long sum = DCHANGE(num, Ary) + DCHANGE(s, Ary);
		num = RCHANGE(sum, Ary);
	}
	void SUB(string s) {
		long long sum = DCHANGE(num, Ary) - DCHANGE(s, Ary);
		num = RCHANGE(sum, Ary);
	}
	void MUL(string s) {
		long long sum = DCHANGE(num, Ary) * DCHANGE(s, Ary);
		num = RCHANGE(sum, Ary);
	}
	void DIV(string s) {
		long long sum = DCHANGE(num, Ary) / DCHANGE(s, Ary);
		num = RCHANGE(sum, Ary);
	}
	void MOD(string s) {
		long long sum = DCHANGE(num, Ary) % DCHANGE(s, Ary);
		num = RCHANGE(sum, Ary);
	}
	void EQUAL() { cout << num << endl; }
	void CLEAR() { num.clear();}
};
int main()
{
	int N;
	cin >> N;
	Calculator ST;
	int flag;
	for(int i=0;i<N;i++){
		int t;
		string s,st;
		cin >> s;
		if (s == "CLEAR"){
            ST.CLEAR();
            flag = 0;
        }else if (s == "NUM"){
			cin >> st;
			switch(flag)
			{
            case 0:ST.NUM(st);break;
            case 1:ST.ADD(st);break;
            case 2:ST.SUB(st);break;
            case 3:ST.MUL(st);break;
            case 4:ST.DIV(st);break;
            case 5:ST.MOD(st);break;
			}
		}else if (s == "CHANGE"){
			cin >> t;
			ST.CHANGE(t);
		}
		else if (s == "ADD")
		    flag = 1;
		else if (s == "SUB")
		    flag = 2;
		else if (s == "MUL")
            flag = 3;
		else if (s == "DIV")
            flag = 4;
		else if (s == "MOD")
			flag = 5;
		else if (s == "EQUAL")
			ST.EQUAL();
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值