歷屆試題 小計算器
時間限制:1.0s 內存限制:256.0MB
問題描述
模擬程序型計算器,依次輸入指令,可能包含的指令有
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’表示10~35
輸入格式
第1行:1個n,表示指令數量
第2…n+1行:每行給出一條指令。指令序列一定以’CLEAR’作爲開始,並且滿足指令規則
輸出格式
依次給出每一次’EQUAL’得到的結果
樣例輸入
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
樣例輸出
2040
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <stack>
#include <cmath>
using namespace std;
char arr[36];
/*
k進制轉10進制,便於運算
*/
long long changeToten(string str, int k)
{
long long sum = 0;
long long j = 1;
for (int i = str.length() - 1; i >= 0; i--, j *= k)
{
//ASCII碼對應爲0-9
if (str[i] >= 48 && str[i] <= 57) {
sum += (str[i] - 48) * j;
}
//ASCII碼對應爲A-Z
else if (str[i] >= 65 && str[i] <= 90) {
sum += (str[i] - 55) * j;
}
}
return sum;
}
//十進制轉化成k進制
string change(long long num, int k)
{
if (num == 0)
return "0";
stack<char> s;
while (num) {
s.push(arr[num%k]);//餘數進棧
num = (long long)(num / k);
}
string str;
while (!s.empty()) {
str += s.top();
s.pop();
}
return str;
}
int main()
{
//ofstream outfile;
//outfile.open("./Debug/Text.txt");
for (int i = 0; i < 36; i++) {
if (i < 10) { arr[i] = 48 + i; }
else arr[i] = 'A' + (i - 10);
}
string operation;
string call;//記錄最近一次運算符
int t;
bool flag_result = false;//讓result只初始化一次
int count = 0;
int nowk = 10;//當前進制,默認爲10進制
string num0, num1;
long long num0_ten, num1_ten;
string result;
long long result_ten;
cin >> t;
while (t--)
{
cin >> operation;
if (operation == "CLEAR") {
num0 = "";
num1 = "";
flag_result = false;
call = "";
count = 0;
}
else if (operation == "NUM") {
if (count++ == 0) {
cin >> num0;
num0_ten = changeToten(num0, nowk);
}
else {
cin >> num1;
num1_ten = changeToten(num1, nowk);
}
//初始化result
if (!flag_result) {
result = num0;
result_ten = changeToten(result, nowk);
flag_result = true;
}
//有新的數輸入就用前一個運算符進行計算
if (count != 1) {
if (call == "ADD") result_ten += num1_ten;
else if (call == "SUB") result_ten -= num1_ten;
else if (call == "MUL") result_ten *= num1_ten;
else if (call == "DIV") result_ten = (long long)(result_ten / num1_ten);
else if (call == "MOD") result_ten %= num1_ten;
}
}
else if (operation == "CHANGE") {
cin >> nowk;
}
else if (operation == "EQUAL") {
result = change(result_ten, nowk);
cout << result << endl;
//把結果寫入文件
//outfile << result << endl;
}
else {
call = operation;
}
}
//outfile.close();
//system("pause");
return 0;
}