蓝桥杯——历届试题小计算器(模拟)

版权声明:Dream_dog专属 https://blog.csdn.net/Dog_dream/article/details/88181923

问题描述

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


  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


 题解:模拟题对于进制转化只需要记录现在的进制状态,对于输入的全部转化为10进制的形式进行计算,在输出的时候在转化回来就好了。


#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<functional>

using namespace std;
#define clr(a,b)  memset(a,b,sizeof(a))

typedef long long ll;
const int maxnn = 10000 + 2;
const int minn = 100;
const double eps = 1e-6;
string toAns(ll n, int ne)//10进制转化为任意进制
{
	if (n == 0)return "0";
	string str;
	while (n)
	{
		int tm = n % ne;
		if (tm <= 9) { str += '0' + tm; }
		else { str += 'A' + tm - 10; }
		n /= ne;
	}
	reverse(str.begin(), str.end());
	return str;
}

ll toTen(string str, int ne)//任意进制转化为10进制
{
	ll ans = 0, arg = 1;
	for (int i = str.size() - 1; i >= 0; --i)
	{
		if (str[i] <= '9') { ans += (str[i] - '0')*arg; }
		else { ans += (str[i] - 'A' + 10)*arg; }
		arg *= ne;
	}
	return ans;
}
ll getOper(ll a, ll b, string op)
{
	if (op == "ADD") { return a + b; }
	else if (op == "SUB") { return a - b; }
	else if (op == "MUL") { return a * b; }
	else if (op == "DIV") { return a / b; }
	else { return a % b; }
}
int main()
{
	//freopen("input1.txt", "r", stdin);
	int  n;
	while (cin >> n)
	{
		ll ans = 0;
		int ne = 10;
		string str, old;
		while (n--)
		{
			cin >> str;
 			if (str == "CLEAR") { str.clear(); old.clear(); }
			else if (str == "EQUAL") { old.clear(); cout<< toAns(ans, ne) << endl; }
			else if (str == "CHANGE") { cin >> ne; }
			else if (str == "NUM"&&old.empty()) { cin >> str; ans = toTen(str, ne); }
			else if (str == "NUM" && !old.empty())
			{
				cin >> str; ans = getOper(ans, toTen(str, ne), old);
			}
			else   { old = str; }
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Dog_dream/article/details/88181923