本文主要是介绍[2017年第八届真题] 小计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目: 传送门
思路: 用字符串读入数字,运算全部转成10进制,最后结果转会k进制就行了
注意:
- 题目运算过程出现的数非负,且小于2^63,所以要用long long
- 读入数字和输出结果都要注意对数位上大于10的数用对应的字母替换
- 注意当答案为0情况
Code:
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<stack>
#include<string>
#include<queue>
#include<algorithm>typedef long long ll;
using namespace std;int n;
ll a, b;
int k = 10;//当前是k进制
ll k_to_ten(string& x) {//把按字符串读入的数字转成k进制数ll sum = 0;ll t = 1;for (int i=x.length()-1;i>=0;i--) {if (x[i] >= '0' && x[i] <= '9') {sum += t * (x[i] - '0');} else if (x[i] >= 'A' && x[i] <= 'Z') {sum += t * (x[i] - 'A' + 10);}t *= k;}return sum;
}
void print_ans(ll x) {//把十进制的答案转成k进制if (x == 0) {cout<<0<<endl;return;}stack<ll> st;while (x > 0) {st.push(x % k);x /= k;}while (!st.empty()) {if (st.top() >=10) {cout<<(char)(st.top() - 10 + 'A');} else {cout<<st.top();}st.pop();}cout<<endl;
}
int main()
{string op, num;//op:操作 num:数字int opop;// + - * / % 五选一cin>>n;while (n--) {cin>>op;if (op == "CLEAR") {a = b = -1;} else if (op == "NUM") {if (a == -1) {//cin>>num;a = k_to_ten(num);} else {cin>>num;b = k_to_ten(num);switch (opop) {case 1:a+=b;break;case 2:a-=b;break;case 3:a*=b;break;case 4:a/=b;break;case 5:a%=b;break;}}//以下五个运算先保存,不急着计算,等到读入第二个数时再计算} else if (op == "CHANGE") {cin>>k;} else if (op == "EQUAL") {print_ans(a);} else if (op == "ADD") {opop = 1;} else if (op == "SUB") {opop = 2;} else if (op == "DIV") {opop = 4;} else if (op == "MUL") {opop = 3;} else if (op == "MOD") {opop = 5;}}return 0;
}
这篇关于[2017年第八届真题] 小计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!