综合练习——7-7 小计算器(20 分)

177 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

题目描述:

模拟程序型计算器,依次输入指令,可能包含的指令有
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'表示1035

输入格式:

第1行:1个n,表示指令数量
第2…n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则
输出格式
依次给出每一次’EQUAL’得到的结果

输出格式:

依次给出每一次’EQUAL’得到的结果

输入样例:

7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL

输出样例:

2040

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB

思路分析:

我的建议是直接模拟操作就好了~

代码如下:

#include<iostream>
#include<string>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
string jinzhi = "0123456789ABCDEFGHYJKLMNOPQRSTUVWXYZ";
long long num[1000];
long long ans;
int cx = 10, t = 1;
string op;
ll change(string s) {
	ll numx = 0, r = 1;
	for (int i = 0; i < s.length(); i++) {
		numx *= r;
		if (s[i] < '0' || s[i] >'9')
			numx += (s[i] - 'A') + 11;
		else
			numx += s[i] - '0';
		r = cx;
	}
	return numx;
}
string changeans(long long w) {
	string m;
	while (w) {
		m += jinzhi[w % cx];
		w /= cx;
	}
	reverse(m.begin(), m.end());
	return m;
}
ll ADD(ll q1, ll q2) {
	return (q1 + q2);
}
ll SUB(ll q1, ll q2) {
	return (q1 - q2);
}
ll MUL(ll q1, ll q2) {
	return (q1 * q2);
}
ll DIV(ll q1, ll q2) {
	return (q1 / q2);
}
ll MOD(ll q1, ll q2) {
	return (q1 % q2);
}
void jisuan() {
	if (op == "ADD") {
		num[t] = ADD(num[t - 1], num[t - 2]);
	}
	else if (op == "SUB") {
		num[t] = SUB(num[t - 2], num[t - 1]);
	}
	else if (op == "MUL") {
		num[t] = MUL(num[t - 1], num[t - 2]);
	}
	else if (op == "MOD") {
		num[t] = MOD(num[t - 2], num[t - 1]);
	}
	else {
		num[t] = DIV(num[t - 2], num[t - 1]);
	}
	t++;
}
int main() {
	int w;
	cin >> w;
	while (w--) {
		string a;
		cin >> a;
		if (a == "NUM") {
			string s;
			cin >> s;
			num[t++] = change(s);
			if (t == 2)
				continue;
			jisuan();
		}
		else if (a == "CHANGE") {
			cin >> cx;
		}
			else if (a == "EQUAL") {
			cout << changeans(num[t - 1]) << '\n';
		}
		else if (a == "CLEAR") {
			memset(num, 0, sizeof ans);
		}
		else {
			op = a;
		}
	}
}

PS:成功解题=理清思路+一定的技巧~