問題描述
模擬程序型計算器,依次輸入指令,可能包含的指令有
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;
}