问题描述
模拟程序型计算器,依次输入指令,可能包含的指令有
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、可以专门用一个数(例:k),记录题目现在要求转化为几进制
3、输出时如果答案是0要记得特判
4、只有输入NUM时接下来才会输入一个数进行运算,还有CHANGE后面会接K表示进制,其他指令后面没有接数字
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int k, i, j, n, y, flag = 0; //flag用来记录接下来会进行什么运算
string s1, s2;
char a[100]; //记录输入的要进行计算的数字
long long sum, x;
scanf("%d", &n);
k = 10;
while(n--)
{
cin>>s1; //c++的string类方便进行比较
if(s1 == "CLEAR") //清除,进制不需要转化
{
sum = 0;
flag = 0;
}
else if(s1 == "CHANGE")
{
cin>>y;
k = y; //将进制转化为k进制
}
else if(s1 == "EQUAL")
{
i = 0;
if(sum == 0) //等于0必须特判,否则只能过30%;
printf("0\n");
else
{
long long sum2 = sum; //sum在转化进制的过程中值会变化,所以先记录下来,方便还原值不影响接下来的计算
while(sum > 0) //sum转化为k进制并存入数组a中
{
a[i] = sum % k;
sum /= k;
i++;
}
for(j = i-1; j >= 0; j--) //输出答案
{
if(a[j] >= 10)
printf("%c", 'A'+(a[j]-10));
else
printf("%d", a[j]);
}
sum = sum2; //还原sum
printf("\n");
}
}
else if(s1 == "NUM")
{
cin>>a;
int h = strlen(a);
long long num = 0;
for(i = 0; i < h; i++) //将输入的数转化为十进制,方便计算
{
int ans;
if(a[i] >= 'A' && a[i] <= 'Z')
ans = a[i] - 'A' + 10;
else
ans = a[i] - '0';
num = num * k + ans;
}
if(flag == 0) //等于0代表前面的数被清除,此时输入的数就是初始值
sum = num;
else if(flag == 1) //加
sum += num;
else if(flag == 2) //减
sum -= num;
else if(flag == 3) //乘
sum *= num;
else if(flag == 4) //除法取商
sum /= num;
else //除法取模
sum %= num;
//cout<<sum<<" "<<num<<endl;
}
else if(s1 == "ADD")
{
flag = 1;
}
else if(s1 == "SUB")
{
flag = 2;
}
else if(s1 == "MUL")
{
flag = 3;
}
else if(s1 == "DIV")
{
flag = 4;
}
else if(s1 == "MOD")
{
flag = 5;
}
}
return 0;
}```