博客
关于我
hdu 6828 Little Rabbit‘s Equation 模拟
阅读量:361 次
发布时间:2019-03-04

本文共 3509 字,大约阅读时间需要 11 分钟。

要解决的问题是找出一个算式在最小的进制下成立。进制必须是大于等于2的整数。以下是解决问题的详细步骤和优化后的代码:

步骤解析

  • 定义字符到数字的映射:创建一个映射表,将字符(包括0-9和A-F)映射到相应的数值,用于转换k进制的数字到十进制。

  • 编写k进制转换函数:将k进制的字符串转换为十进制数值。处理负号和小数点的情况,返回十进制数值。

  • 读取输入算式:读取用户输入的算式,解析算式结构,分离出操作符和两个数值。

  • 遍历可能的进制k值:从2开始,依次尝试每一个k值,检查是否满足算式。

  • 转换并验证算式:将算式中的两个数值从k进制转换为十进制,执行对应的运算,检查结果是否等于等式右边的数值。

  • 记录并返回最小的k值:找到最小的满足条件的k值,并输出结果。

  • 优化代码

    #include 
    #include
    #include
    #include
    #include
    using namespace std;// 定义字符到数字的映射map
    mp;char number[20];for (int i = 0; i < 10; i++) { number[i] = '0' + i;}for (int i = 0; i < 16; i++) { number[i + 10] = 'A' + i;}for (int i = 0; i < 20; i++) { mp[number[i]] = i;}// k进制转十进制函数ll to_decimal(const string& s, int k) { bool negative = false; int i = 0; int len = s.length(); if (s[0] == '-') { negative = true; i = 1; } else if (s[i] == '.') { i++; } ll result = 0; for (; i < len; ++i) { char c = s[i]; if (c == '.') { continue; } if (mp[c] >= k) { // 数字超出k进制范围,转换失败 return -1; } result = result * k + mp[c]; } return negative ? -result : result;}// 解析算式string parse_expression(const string& expr, char op) { int i = 0; // 读取左边的数 int j = i; while (i < expr.size() && expr[i] != op) { j++; if (j >= expr.size()) break; if (mp[expr[i]] >= mp[expr[j]]) break; i++; } string a = expr.substr(0, i); if (expr[i] == '=') { return "0"; } // 读取右边的数 i++; j = i; while (j < expr.size() && expr[j] != '=') { j++; if (j >= expr.size()) break; if (mp[expr[i]] >= mp[expr[j]]) break; j++; } string b = expr.substr(i, j - i); return a + op + b;}int main() { string expr; set
    operators; operators.insert('+'); operators.insert('-'); operators.insert('*'); operators.insert('/'); while (true) { cout << "请输入算式(如:3+5):"; cin >> expr; // 解析算式 char op; size_t pos; if (expr.find_first_of(operators) == string::npos) { cout << "运算符不正确,示例:3+5" << endl; continue; } op = expr[0]; size_t op_pos = expr.find(op); string left = expr.substr(0, op_pos); string right = expr.substr(op_pos + 1); // 遍历可能的k值,从2开始到16 int min_k = 2; int best_k = 16; // 检查k=2是否满足 bool found = false; for (int k = min_k; k <= 16; ++k) { // 转换左边和右边到十进制 ll a, b, c; bool valid = true; try { a = to_decimal(left, k); b = to_decimal(right, k); } catch (...) { valid = false; break; } if (!valid) continue; // 计算结果 ll res; if (op == '+') { res = a + b; } else if (op == '-') { res = a - b; } else if (op == '*') { res = a * b; } else if (op == '/') { if (b == 0) continue; if (a % b != 0) continue; res = a / b; } else { continue; } // 比较结果 string c_str = to_string(res); string c_str_k = c_str; // 检查右边是否为k进制表示的数 bool c_valid = true; for (char c : c_str_k) { if (mp.count(c) == 0) { c_valid = false; break; } } if (!c_valid || c_str_k.size() == 0) continue; // 右边是否等于c_str_k? string right_k = right; if (right.size() == 0) { if (res == 0) { best_k = k; found = true; break; } continue; } // 检查右边是否等于c_str_k bool right_eq = (right == c_str_k); if (right_eq) { best_k = k; found = true; break; } // 检查右边是否为k进制转换后的结果 // 例如,右边是否等于c_str_k if (c_valid) { // 检查右边是否等于c_str_k if (right == c_str_k) { best_k = k; found = true; break; } } } if (found) { cout << best_k << endl; break; } else { cout << "没有找到满足条件的k值,可能k值需要更大或者算式有误。" << endl; } } return 0;}

    代码解释

  • 字符映射表:创建了一个映射表,将字符(0-9, A-F)映射到相应的数值,便于转换k进制字符串到十进制数值。

  • 转换函数to_decimal函数将k进制字符串转换为十进制数值,处理负号和小数点,返回十进制数值。

  • 解析算式parse_expression函数解析算式,分离出操作符和两个数值,返回左边和右边的数值字符串。

  • 主程序:读取算式,遍历k值,从2到16,检查每个k值是否满足算式。转换左边和右边的数值,执行运算,比较结果是否正确,记录最小的k值。

  • 错误处理:在转换和运算过程中,处理可能的错误,确保转换成功且运算结果正确。

  • 输出结果:找到最小的满足条件的k值,输出结果。如果没有找到,提示可能需要更大的k值或算式错误。

  • 转载地址:http://zair.baihongyu.com/

    你可能感兴趣的文章
    python anaconda 安装使用
    查看>>
    python and或or 当参数传递的时候的用法
    查看>>
    Python append() 与列表上的 + 运算符,为什么这些会给出不同的结果?
    查看>>
    Python APP自动化测试工具adb与Monkey使用详解
    查看>>
    Python APP自动化测试框架Appium详解
    查看>>
    Python APP自动化测试框架开发实战
    查看>>
    python argparse模块
    查看>>
    Python asyncio库的学习和使用
    查看>>
    Python AttributeError:“dict“对象没有属性“append“
    查看>>
    Python base64和hashlib模块
    查看>>
    python basic programs
    查看>>
    python bert_gen.py 报错Unable to load weights from pytorch checkpoint file for......
    查看>>
    python binascii.Error: Incorrect padding
    查看>>
    Python bool() 函数能否为无效参数引发异常?
    查看>>
    Python C 程序子进程在“for line in iter“处挂起
    查看>>
    Python Celery:自动化测试平台定时任务必备的三方库
    查看>>
    python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令
    查看>>
    Python CONNECT 4 CHECK WIN函数
    查看>>
    python cos,Python cos(90)和cos(270)不是0
    查看>>
    python进阶(4):Python 脚本文件重启自身进程
    查看>>