题目解析
* 输入输出:第一行输入整数 NNN 表示题目数量。接下来 NNN 行,每行为一个字符串,格式固定为 x 单位1 = ? 单位2,其中 x 为待转换数值(0≤x≤10000 \le x \le 10000≤x≤1000),单位1 和 单位2 为单位缩写(同属于长度或重量单位,且 单位1 > 单位2)。输出 NNN 行,将 ? 替换为计算后的整数结果,其余部分原样输出。
* 数据范围:1≤N≤10001 \le N \le 10001≤N≤1000,x≤1000x \le 1000x≤1000。由于最大转换倍数为 10610^6106(如 km 到 mm),最大结果为 10910^9109,需使用 64 位整数防止溢出。
* 复杂度要求:每行处理为 O(1)O(1)O(1) 的字符串比较与乘法运算,总复杂度 O(N)O(N)O(N),可忽略。
* 算法知识点:字符串输入处理、条件分支、单位换算、long long 类型使用
思路解析
1. 解析输入结构:利用 cin 按空白字符分割的特性,顺序读取数值 num1、原单位 base1、等号(用临时变量 s 吸收)、问号(再用 s 吸收)、目标单位 base2。这样可以忽略固定格式的符号,直接提取关键信息。
2. 确定转换倍数:由于题目保证总是从大单位转换为小单位,且进制固定为 100010001000,只需判断单位组合的层级差:
* 跨两级(如 km→mm 或 kg→mg):倍数 =1000×1000=106= 1000 \times 1000 = 10^6=1000×1000=106
* 跨一级(如 km→m, m→mm, kg→g, g→mg):倍数 =1000= 1000=1000
通过 if-else if 链判断 base1 和 base2 的具体值,计算 num2 = num1 * 倍数。
3. 格式化输出:使用 printf 按原格式输出,注意将 long long 类型数值以 %lld 格式打印,并将 string 类型单位通过 .c_str() 转为 C 风格字符串。
完整代码