小计算器

题目描述

7cc3e29e931941ed9861b4c8a14019f3.png

输入描述

4b2f89053cf34efb9cd95fc83450f20f.png

输出描述

依次输出每一次 '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;
}

详细解释:

  1. 头文件和命名空间

    • #include <bits/stdc++.h>:包含所有标准库的头文件,便于开发。
    • using namespace std;:使用 std 命名空间,避免每次都写全限定名。
  2. 类型定义

    • typedef long long ll;:定义 ll 作为 long long 类型的别名,用于处理较大的整数。
  3. 函数 toans(ll n, ll ne)

    • 将十进制数 n 转换为 ne 进制的字符串表示。使用了除法和取模操作,逐位构建结果字符串,并最终反转。
  4. 函数 toten(string str, int ne)

    • 将 ne 进制的字符串 str 转换为十进制数。从字符串的末尾开始,根据字符的大小写数字值计算出十进制结果。
  5. 函数 getop(ll a, ll b, string op)

    • 根据操作符 op 执行加法 (ADD)、减法 (SUB)、乘法 (MUL)、除法 (DIV) 和模运算 (MOD)。返回计算结果。
  6. 主函数 main()

    • cin >> n;:输入操作次数 n
    • ll ans = 0;:初始化结果为0。
    • int ne = 10;:初始化进制为十进制。
    • string str, op;:用于保存输入的指令和当前操作符。
  7. 主循环 while (n--)

    • 根据输入的指令执行相应的操作:清除 (CLEAR)、输出当前结果 (EQUAL)、切换进制 (CHANGE)、输入数字 (NUM)、设置操作符。
    • 根据输入的操作执行相应的处理:清空字符串和操作符、转换进制、转换并计算结果等。

 

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值