1. 程式人生 > >藍橋杯PREV-55小計算器C++實現

藍橋杯PREV-55小計算器C++實現

問題描述

  模擬程式型計算器,依次輸入指令,可能包含的指令有


  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

解題思路:

內部所有使用10進位制進行計算,儲存當前進位制,輸入使用當前進位制進行轉換。對輸入使用stringstream進行分離,判斷。

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <deque>
#include <string>
#include <map>
#include <sstream>
using namespace std;

class Min_cal
{
public:
	Min_cal();
	long long int trans_to_int(string input_sum);//所有進位制先轉化為10進位制進行計算
	void change_num(string s)
	{
		sum = trans_to_int(s);
	}
	void my_add(string input_sum);
	void my_sub(string input_sum);
	void my_mul(string input_sum);
	void my_div(string input_sum);
	void my_mod(string input_sum);
	void chang_rad(long long int input_rad);
	void display();
	void clear();
private:
	long long int now_rad;//當前進位制
	long long int sum;//當前數字按照10進位制計算
	map<char, int> trans_table;//儲存0 - 9 , A-Z, 對應10-35
};
Min_cal::Min_cal()
{
	char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	
	now_rad = 10;
	sum = 0;
	stringstream ss;//轉換格式
	char key;
	for (long long int i = 0; i < 10; i++)
	{
		ss << i;
		ss >> key;
		trans_table[key] = i;
	}
	for (long long int i = 0; i < 26; i++)
	{
		trans_table[table[i]] = i + 10;
	}
}
long long int Min_cal::trans_to_int(string input_sum)
{
	long long int ret = 0;
	string::iterator begin = input_sum.begin();
	ret = trans_table[*begin++];
	
	for (; begin != input_sum.end(); begin++) 
	{
		ret = (ret ) * now_rad + trans_table[*begin];
	}
	return ret;
}
void Min_cal::my_add(string input_sum)
{
	long long int traned_sum = trans_to_int(input_sum);
	sum += traned_sum;
}
void Min_cal::my_sub(string input_sum)
{
	long long int traned_sum = trans_to_int(input_sum);
	sum -= traned_sum;
}
void Min_cal::my_div(string input_sum)
{
	long long int traned_sum = trans_to_int(input_sum);
	sum /= traned_sum;
}
void Min_cal::my_mul(string input_sum)
{
	long long int traned_sum = trans_to_int(input_sum);
	sum *= traned_sum;
}
void Min_cal::my_mod(string input_sum)
{
	long long int traned_sum = trans_to_int(input_sum);
	sum %= traned_sum;
}
void Min_cal::chang_rad(long long int input_rad)
{
	now_rad = input_rad;
}
void Min_cal::display()
{
	                           
	char table1[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	string out;
	long long int flag = sum;
	long long int i = flag % now_rad;
	flag = flag / now_rad;
	while (flag != 0) 
	{
		out.push_back(table1[i]);
		i = flag % now_rad;
		flag /= now_rad;
	}
	out.push_back(table1[i]);
	for (string::reverse_iterator  s = out.rbegin(); s != out.rend(); s++)
	{
		cout << *s;
	}
	cout << endl;
}
void Min_cal::clear()
{
	sum = 0;
}

int main()
{
	vector<string> all_input;
	long long int size, flag = 0;
	cin >> size;
	getchar();
	for (int i = 0; i < size; i++)
	{
		string s;
		getline(cin, s);
		all_input.push_back(s);
	}
	Min_cal cal;
	string prv1, prv2;
	for (int i = 0; i < all_input.size(); i++)
	{
		stringstream ss(all_input[i]);
		ss >> prv1;
		if (prv1 == "ADD" || prv1 == "SUB" || prv1 == "MUL" || prv1 == "DIV" || prv1 == "MOD")
		{
			if (prv1 == "ADD")
				flag = 1;
			else if (prv1 == "SUB")
				flag = 2;
			else if (prv1 == "MUL")
				flag = 3;
			else if (prv1 == "DIV")
				flag = 4;
			else if (prv1 == "MOD")
				flag = 5;
		}
		else if (prv1 == "NUM")
		{
			if (flag != 0)
			{
				ss >> prv2;
				switch (flag)
				{
				case 1:
					cal.my_add(prv2);
					break;
				case 2:
					cal.my_sub(prv2);
					break;
				case 3:
					cal.my_mul(prv2);
					break;
				case 4:
					cal.my_div(prv2);
					break;
				case 5:
					cal.my_mod(prv2);
					break;
				}
				flag = 0;
			}
			else
			{
				if (flag == 0)
				{
					ss >> prv2;
					cal.change_num(prv2);
				}
			}

		}
		else if (prv1 == "CHANGE")
		{
			int prv2;
			ss >> prv2;
			cal.chang_rad(prv2);
		}
		else if (prv1 == "CLEAR")
		{
			cal.clear();
		}
		else if (prv1 == "EQUAL")
		{
			cal.display();
		}
	}
    return 0;
}