问题描述:
模拟程序型计算器,依次输入指令,可能包含的指令有
- 数字:‘NUM X’,X为一个只包含大写字母和数字的字符串,表示一个当前进制的数
- 运算指令:‘ADD’,‘SUB’,‘MUL’,‘DIV’,‘MOD’,分别表示加减乘,除法取商,除法取余
- 进制转换指令:‘CHANGE K’,将当前进制转换为K进制(2≤K≤36)
- 输出指令:‘EQUAL’,以当前进制输出结果
- 重置指令:‘CLEAR’,清除当前数字
指令按照以下规则给出:
数字,运算指令不会连续给出,进制转换指令,输出指令,重置指令有可能连续给出
运算指令后出现的第一个数字,表示参与运算的数字。且在该运算指令和该数字中间不会出现运算指令和输出指令
重置指令后出现的第一个数字,表示基础值。且在重置指令和第一个数字中间不会出现运算指令和输出指令
进制转换指令可能出现在任何地方
运算过程中中间变量均为非负整数,且小于2^63。
以大写的’A’'Z’表示1035
输入说明 :
第1行:1个n,表示指令数量
第2…n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则
输出说明 :
依次给出每一次’EQUAL’得到的结果
输入范例 :
10
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
SUB
NUM 137
EQUAL
输出范例 :
2040
1701
思路:
整体思路很顺畅,就是把要算的数转为10进制算,算完之后再转为当前的进制
主要是错在了很多小坑上,比如进制转换的判空判零等,还需多涨涨相关经验
代码实现:
#include<bits/stdc++.h>
using namespace std;
int ChToNum(char c)
{
if(isdigit(c)) return c-'0';
else return c-'A'+10;
}
char NumToCh(int num)
{
if(num<10) return num+'0';
else
{
return num-10+'A';
}
}
long long llpow(int base,int n)
{
long long res=1;
for(int i=1;i<=n;i++)
{
res*=base;
}
return res;
}
string ConvertTo10(int base,string num)
{
reverse(num.begin(),num.end());
long long res=0;
for(int i=0;i<num.size();i++)
{
res+=(llpow(base,i)*ChToNum(num[i]));
}
stringstream ss;
ss<<res;
return ss.str();
}
//将10进制转为base进制
string Convert(int base,long long num)
{
string res;
if(num==0) return "0";
while(num!=0)
{
res+=NumToCh(num%base);
num/=base;
}
reverse(res.begin(),res.end());
return res;
}
int main()
{
int n;
cin>>n;
int base=10;
string res="";
string cmd,ch;
for(int i=0;i<n;i++)
{
cin>>cmd;
if(cmd=="NUM")
{
string num;
cin>>num;
if(res=="")
{
res=num;
continue;
}
long long temp1=atoll(ConvertTo10(base,res).c_str()),temp2=atoll(ConvertTo10(base,num).c_str());
long long sum;
if(ch=="ADD")
{
sum=temp1+temp2;
}
else if(ch=="SUB")
{
sum=temp1-temp2;
}
else if(ch=="MUL")
{
sum=temp1*temp2;
}
else if(ch=="DIV")
{
sum=temp1/temp2;
}
else if(ch=="MOD")
{
sum=temp1%temp2;
}
//cout<<temp1<<ch<<temp2<<"="<<sum<<endl;
res=Convert(base,sum);
}
else if(cmd=="CLEAR")
{
res="";
}
else if(cmd=="EQUAL")
{
cout<<res<<endl;
}
else if(cmd=="CHANGE")
{
int newBase;
cin>>newBase;
if(res.size()!=0)
{
long long num=atoll(ConvertTo10(base,res).c_str());
res=Convert(newBase,num);
}
base=newBase;
}
else
{
ch=cmd.substr(0);
}
//cout<<endl<<res<<endl<<endl;
}
}