题目描述
输入描述
输出描述
依次输出每一次 'EQUAL' 得到的结果。
输入输出样例
示例
输入
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
输出
2040
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
总通过次数: 733 | 总提交次数: 909 | 通过率: 80.6%
难度: 困难 标签: 2017, 模拟, 国赛
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// 十进制转任意进制
string toans(ll n, ll ne) {
if (n == 0)
return "0";
string str;
while (n) {
int tm = n % ne;
if (tm <= 9)
str += '0' + tm;
else
str += 'A' + tm - 10;
n /= ne;
}
reverse(str.begin(), str.end());
return str;
}
// 任意进制转十进制
ll toten(string str, int ne) {
ll ans = 0, arg = 1;
for (int i = str.size() - 1; i >= 0; i--) {
if (str[i] <= '9')
ans += (str[i] - '0') * arg;
else
ans += (str[i] - 'A' + 10) * arg;
arg *= ne;
}
return ans;
}
// 进行加减乘除模运算
ll getop(ll a, ll b, string op) {
if (op == "ADD")
return a + b;
else if (op == "SUB")
return a - b;
else if (op == "MUL")
return a * b;
else if (op == "DIV")
return a / b;
else if (op == "MOD")
return a % b;
else
return 0; // 如果op不在预期的操作符范围内,默认返回0
}
int main() {
int n;
cin >> n; // 输入操作次数
ll ans = 0; // 保存计算结果
int ne = 10; // 初始化为十进制
string str, op; // str用于保存输入的字符串,op用于保存当前操作符
while (n--) {
cin >> str; // 读取操作指令
if (str == "CLEAR") {
str.clear(); // 清空输入字符串
op.clear(); // 清空操作符
} else if (str == "EQUAL") {
op.clear(); // 清空操作符
cout << toans(ans, ne) << endl; // 输出当前结果的任意进制表示
} else if (str == "CHANGE") {
cin >> ne; // 切换进制
} else if (str == "NUM" && op.empty()) {
cin >> str; // 输入数字字符串
ans = toten(str, ne); // 转换为十进制保存到ans中
} else if (str == "NUM" && !op.empty()) {
cin >> str; // 输入数字字符串
ans = getop(ans, toten(str, ne), op); // 进行运算并更新ans
} else {
op = str; // 更新当前操作符
}
}
return 0;
}
详细解释:
-
头文件和命名空间
#include <bits/stdc++.h>
:包含所有标准库的头文件,便于开发。using namespace std;
:使用std
命名空间,避免每次都写全限定名。
-
类型定义
typedef long long ll;
:定义ll
作为long long
类型的别名,用于处理较大的整数。
-
函数
toans(ll n, ll ne)
- 将十进制数
n
转换为ne
进制的字符串表示。使用了除法和取模操作,逐位构建结果字符串,并最终反转。
- 将十进制数
-
函数
toten(string str, int ne)
- 将
ne
进制的字符串str
转换为十进制数。从字符串的末尾开始,根据字符的大小写数字值计算出十进制结果。
- 将
-
函数
getop(ll a, ll b, string op)
- 根据操作符
op
执行加法 (ADD
)、减法 (SUB
)、乘法 (MUL
)、除法 (DIV
) 和模运算 (MOD
)。返回计算结果。
- 根据操作符
-
主函数
main()
cin >> n;
:输入操作次数n
。ll ans = 0;
:初始化结果为0。int ne = 10;
:初始化进制为十进制。string str, op;
:用于保存输入的指令和当前操作符。
-
主循环
while (n--)
- 根据输入的指令执行相应的操作:清除 (
CLEAR
)、输出当前结果 (EQUAL
)、切换进制 (CHANGE
)、输入数字 (NUM
)、设置操作符。 - 根据输入的操作执行相应的处理:清空字符串和操作符、转换进制、转换并计算结果等。
- 根据输入的指令执行相应的操作:清除 (