藍橋杯歷屆試題 小計算器

歷屆試題 小計算器

時間限制: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章