历届试题 小计算器

xiaoxiao2021-02-28  30

  历届试题 小计算器   时间限制: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

解题思路:

(1)写两个函数 分别实现从K进制到十进制的转化和从十进制到K进制的转化 如:DCHANGE(),RCHANGE()

(2)写一个类 储存此计算器所使用的所有功能  class Calculator{},以及成员 数字"num" 和 进制"Ary"

(3)题目要求的 加减乘除商取余 其实都可以转化为十进制来计算

        这时就用到了我们(1)中的函数,先转为十进制,运算完后还原为K进制

(4)在解决 运算符号输入问题中 使用了flag来判断 switch...case...来解决NUM的用处

注意事项:

(1)题目保证运算过程均为非负数 因此不必考虑绝对值

(2)pow()函数无法实现大数位的乘方 因此在转化时博主采用了一个一个相乘的方法

(3)CLEAR()只是清空了数字,进制并未清除

代码如下:

#include<iostream> #include<cmath> #include<string> using namespace std; long long DCHANGE(string s, int Ary) { long long t = 0,PO = 1; for (int i = s.length() - 1, j = 0; i >= 0; i--, j++) { if (isdigit(s[i])) t += (s[i] - '0')*PO; else t += (s[i] - 'A' + 10)*PO; PO = PO * Ary; } return t; } string RCHANGE(long long t, int k) { string num; if(t==0)num="0"; while (t) { char c; if (t%k < 10) c = t % k + '0'; else c = (t % k - 10) + 'A'; num = c + num; t = t / k; } return num; } class Calculator { public: Calculator() { Ary=10; } void NUM(string s) { num = s; } void CHANGE(int k) { num = RCHANGE(DCHANGE(num, Ary), k); Ary = k; } void ADD(string s) { long long sum = DCHANGE(num, Ary) + DCHANGE(s, Ary); num = RCHANGE(sum, Ary); } void SUB(string s) { long long sum = DCHANGE(num, Ary) - DCHANGE(s, Ary); num = RCHANGE(sum, Ary); } void MUL(string s) { long long sum = DCHANGE(num, Ary) * DCHANGE(s, Ary); num = RCHANGE(sum, Ary); } void DIV(string s) { long long sum = DCHANGE(num, Ary) / DCHANGE(s, Ary); num = RCHANGE(sum, Ary); } void MOD(string s) { long long sum = DCHANGE(num, Ary) % DCHANGE(s, Ary); num = RCHANGE(sum, Ary); } void EQUAL() { cout << num << endl; } void CLEAR() { num.clear();} private: int Ary; //进制 string num; }; int main() { int N; cin >> N; Calculator ST; int flag; for(int i=0;i<N;i++) { int t; string s,st; cin >> s; if (s == "CLEAR") { ST.CLEAR(); flag = 0; } else if (s == "NUM") { cin >> st; switch(flag) { case 0:ST.NUM(st);break; case 1:ST.ADD(st);break; case 2:ST.SUB(st);break; case 3:ST.MUL(st);break; case 4:ST.DIV(st);break; case 5:ST.MOD(st);break; } } else if (s == "CHANGE") { cin >> t; ST.CHANGE(t); } else if (s == "ADD") flag = 1; else if (s == "SUB") flag = 2; else if (s == "MUL") flag = 3; else if (s == "DIV") flag = 4; else if (s == "MOD") flag = 5; else if (s == "EQUAL") ST.EQUAL(); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2472853.html

最新回复(0)