markdown1# 单位转换 题解 2 3## 一、题目分析 4 5小杨遇到一系列单位转换问题,只涉及长度单位(千米 `km`、米 `m`、毫米 `mm`)和重量单位(千克 `kg`、克 `g`、毫克 `mg`)。所有题目都是从较大的单位转换为较小的单位,例如“米 → 毫米”、“千米 → 米”等。已知转换关系: 6 7- 长度:`1 km = 1000 m = 1000000 mm` 8- 重量:`1 kg = 1000 g = 1000000 mg` 9 10每行输入的格式为:`x 单位1 = ? 单位2`,需要程序计算出 `?` 处的数值并原格式输出。 11 12## 二、解题思路 13 14因为题目只涉及大单位转小单位,而且输入数量 `x` 是整数,答案也一定是整数。我们可以建立一个“换算基数”的概念:对于每一个单位,计算它相对于最小单位(`mm` 或 `mg`)的倍数。设三个单位的基数分别为: 15 16- `mm` 或 `mg`:基数为 **1** 17- `m` 或 `g`:基数为 **1000** 18- `km` 或 `kg`:基数为 **1000000** 19 20那么将 `x` 个 **单位1** 转换为 **单位2** 的公式为: 21 22\[ 23\text{答案} = \frac{x \times \text{基数}_1}{\text{基数}_2} 24\] 25 26因为单位1 一定比 单位2 大,所以 `基数1 > 基数2`,算出的结果一定是整数。 27 28## 三、算法说明 29 30我们可以利用单位英文缩写的规律,用一个函数直接求出基数,而不需要建立复杂的映射表。 31 32观察三个单位的缩写: 33- 如果缩写长度为 1(只有 `m` 或 `g`),基数为 **1000**。 34- 如果缩写第一个字母是 `k`(即 `km` 或 `kg`),基数为 **1000000**。 35- 剩下的情况(`mm` 或 `mg`),基数为 **1**。 36 37因此我们写出 `get_base` 函数: 38```cpp 39int get_base(char *s) { 40 if (strlen(s) == 1) // 如 "m", "g" 41 return 1000; 42 return s[0] == 'k' ? 1000000 : 1; // "km"/"kg" 返回 1000000,否则 "mm"/"mg" 返回 1 43}
对于输入的处理,由于格式固定为 x 单位1 = ? 单位2,我们可以先用 scanf 读入整数 x 和第一个单位 s1,然后连续用三次 scanf("%s", s2) 将 =、? 和目标单位依次读入同一个变量 s2,这样最后 s2 中存放的就是单位2。这种做法简单且足够应对本题格式。
最后输出:printf("%d %s = %d %s\n", x, s1, x * get_base(s1) / get_base(s2), s2);
对于每个问题,我们只进行几次常数时间的字符串判断和一次整数乘法、除法。因此处理 N 个问题的时间复杂度为 O(N)。本题 N ≤ 1000,足够快。
空间复杂度:只用了几个小数组,可以认为是 O(1)。
下面是修正后的完整 C++ 代码(修正了原参考代码中的头文件名与 using namespace std 的拼写):
cpp1#include <cstdio> 2#include <cstring> 3#include <algorithm> 4using namespace std; 5 6int get_base(char *s) { 7 if (strlen(s) == 1) // 单位 "m" 或 "g" 8 return 1000; 9 return s[0] == 'k' ? 1000000 : 1; // "km"/"kg" 返回 1000000,"mm"/"mg" 返回 1 10} 11 12int main() { 13 int T; 14 scanf("%d", &T); 15 while (T--) { 16 int x; 17 char s1[5], s2[5]; 18 scanf("%d %s", &x, s1); // 读入 x 和 单位1 19 scanf("%s", s2); // 读入 "=" 20 scanf("%s", s2); // 读入 "?"(覆盖) 21 scanf("%s", s2); // 读入 单位2(覆盖) 22 printf("%d %s = %d %s\n", x, s1, 23 x * get_base(s1) / get_base(s2), s2); 24 } 25 return 0; 26}
代码说明:
get_base 函数根据单位缩写快速返回相对于最小单位的倍数。s2 的方法跳过无关字符,简化输入解析。x * 基数1 / 基数2 计算答案并输出。这样我们就轻松地帮小杨解决了单位换算的问题!