问题描述
模拟程序型计算器,依次输入指令,可能包含的指令有
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’得到的结果
样例输入
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
样例输出
2040
解题思路:一个很简单的模拟题,主要思路就是
- 不管什么进制在运算时都转换成十进制来进行计算
- 只有在输出的时候按照最后一次要求的进制转换成该进制即可。
- 注意理解题目,题目中的“ EQUAL”只是用来按照最新一次出现的进制输出最后的数据,运算结果并不清除。
- “CLEAR”只是用将结果置为0和开始重新输入,“Clear”操作不会改变当前的进制情况。
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll ans = 0;
string change(int k)///十进制转化成其他进制
{
string s="";
ll n = ans;
char c;
if( n == 0)
s = "0";
while(n){
int temp = n%k;
if( temp >= 0 && temp < 10)
c = temp + '0';
else
c = (temp - 10) + 'A';
n = n/k;
s = c + s;
}
//reverse(ans.begin(),ans.end());
return s;
}
long long int change_ten(string str,int k)///其他进制转化成十进制
{
long long int ans = 0,temp;
int len = str.length();
for(int i = 0; i < len; i ++){
if(str[i] >= '0' && str[i] <= '9')
temp = str[i] - '0';
else
temp = 10 + (str[i] - 'A');
ans = ans * k + temp;
}
return ans;
}
int main()
{
int n;
int k = 10;
string str;
string op;
long long int op1;
cin>>n;
int flag;
while(n--){
cin>>str;
if( str=="CLEAR"){
flag = 0;
ans = 0;
}
else if( str == "EQUAL"){
cout<<change(k)<<endl;
}
else if(str == "NUM"){
cin>>op;
op1 = change_ten(op,k);
switch(flag){
case 0: ans = op1; break;
case 1: ans = ans + op1; break;
case 2: ans = ans - op1; break;
case 3: ans = ans * op1; break;
case 4: ans = ans / op1; break;
case 5: ans = ans % op1; break;
}
}
else if( str == "CHANGE"){
cin>>k;
}
else if( str == "ADD" ){
flag = 1;
}
else if( str == "SUB"){
flag = 2;
}
else if( str == "MUL"){
flag = 3;
}
else if( str == "DIV"){
flag = 4;
}
else if( str == "MOD"){
flag = 5;
}
}
return 0;
}