问题描述
模拟程序型计算器,依次输入指令,可能包含的指令有
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
【想说的】 :我真的很不喜欢模拟题,虽然我知道是很简单的题目。这次其实也卡了一下,主要是卡了两个地方:1.读题读的什么玩意,这个计算器模拟在题目暗示你,计算完了之后,如果没有清零操作的话,结果自动作为下一次计算的第一个数。 2.在把任意进制转化为十进制的时候,字母位数减完A以后怎么会忘记加一个10呢,然后就一直错一直错,所以要想清楚。
【启事】:练习一下c++的进制转换什么的。
题解
#include <iostream>
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=105;
char a[20];
string tnum;
int j=10;
ll num1,num2,all;
char op;
int k=1;
void cal()
{
switch(op){
case '+':all=num1+num2;break;
case '-':all=num1-num2;break;
case '*':all=num1*num2;break;
case '/':all=num1/num2;break;
case '%':all=num1%num2;break;
}
num1=all;
k=2;
}
ll gnum(string b)
{
ll tem=0;
ll ji=1;
int f=0;
for(int i=b.length()-1;i>=0;i--)
{
if(b[i]<='9'&&b[i]>='0')
{
tem+=(b[i]-'0')*ji;
ji=ji*j;
}
else if(b[i]=='-')
{
f=1;
}
else{
tem+=(b[i]-'A'+10)*ji;
ji=ji*j;
}
}
if(f==1)
return tem*-1;
return tem;
}
void getnum()
{
cin>>tnum;
//cout<<tnum<<endl;
ll ttnum=gnum(tnum);
if(k==1)
{
num1=ttnum;
k=2;
}
else{
num2=ttnum;
cal();
}
}
string pa()
{
string str="";
ll ta=all;
do{
ll t=ta%j;
if(t>=0&&t<=9)
str+=t+'0';
else
str+=t-10+'A';
ta/=j;
}while(ta!=0);
reverse(str.begin(),str.end());
num1=gnum(str);
k=2;
return str;
}
int main()
{
j=10;
k=1;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf(" %s",&a);
if(a[0]=='N')
{
getnum();
//cout<<" num1="<<num1<<" num2="<<num2<<endl;
}
else if(a[0]=='A')
{
op='+';
}
else if(a[0]=='S')
{
op='-';
}
else if(a[0]=='M'&&a[1]=='U')
{
op='*';
}
else if(a[0]=='D')
{
op='/';
}
else if(a[0]=='M'&&a[1]=='O')
{
op='%';
}
else if(a[0]=='C'&&a[1]=='H')
{
scanf("%d",&j);
// cout<<"j="<<j<<" all="<<all<<endl;
}
else if(a[0]=='E')
{
cout<<pa()<<endl;
}
else{
all=0;
num1=0;
num2=0;
}
}
return 0;
}