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

    你可能感兴趣的文章
    NoSQL&MongoDB
    查看>>
    NoSQL介绍
    查看>>
    NoSQL数据库概述
    查看>>
    Notadd —— 基于 nest.js 的微服务开发框架
    查看>>
    NOTE:rfc5766-turn-server
    查看>>
    Notepad ++ 安装与配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    Notepad++在线和离线安装JSON格式化插件
    查看>>
    notepad++最详情汇总
    查看>>
    notepad++正则表达式替换字符串详解
    查看>>
    notepad如何自动对齐_notepad++怎么自动排版
    查看>>
    Notes on Paul Irish's "Things I learned from the jQuery source" casts
    查看>>
    Notification 使用详解(很全
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    NotImplementedError: Could not run torchvision::nms
    查看>>
    nova基于ubs机制扩展scheduler-filter
    查看>>
    Now trying to drop the old temporary tablespace, the session hangs.
    查看>>
    nowcoder—Beauty of Trees
    查看>>
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>