博客
关于我
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/

    你可能感兴趣的文章
    nginx配置域名和ip同时访问、开放多端口
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nginx配置文件nginx.conf中文详解(总结)
    查看>>
    Nginx配置负载均衡到后台网关集群
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>