从单位换算题,聊聊 C++ 里的两种写法:map 与 非 map
从单位换算题,聊聊 C++ 里的两种写法:map 与 非 map
刚开始学编程时,很多人都会遇到“单位换算”这种题。
比如:
GESP 2023年12月认证C++三级真题: 单位转换。
看起来不难:
千米转米
米转毫米
千克转克
克转毫克
但真正写代码时,问题就来了。
到底该怎么写?
有的人会写一大堆 if:
if(a=="km" && b=="m")
还有的人会用:
map<string,long long>
两种方式都能做。
但思路完全不一样。
今天就拿一道经典单位换算题,聊聊:
不用 map 怎么写
用 map 怎么写
两种方法的区别是什么
为什么“统一单位”这种思维特别重要
题目描述
已知:
长度单位:
1 km = 1000 m = 1000000 mm
重量单位:
1 kg = 1000 g = 1000000 mg
输入若干组数据。
例如:
1 km = ? mm
5 kg = ? g
2 m = ? mm
输出结果。
例如:
1 km = 1000000 mm
5 kg = 5000 g
2 m = 2000 mm
第一反应:疯狂写 if
很多初学者第一时间会这样写:
if(a=="km" && b=="m")
{
ans=x*1000;
}
然后继续:
if(a=="km" && b=="mm")
再继续:
if(a=="m" && b=="mm")
长度单位写完。
重量单位继续。
最后代码会越来越长。
虽然能过题。
但维护起来非常痛苦。
更好的思路:统一成最小单位
真正简单的方法是:
先把所有单位都转换成“最小单位”。
例如:
长度统一成 mm
| 单位 | 值 |
|---|---|
| km | 1000000 |
| m | 1000 |
| mm | 1 |
重量统一成 mg
| 单位 | 值 |
|---|---|
| kg | 1000000 |
| g | 1000 |
| mg | 1 |
这样问题一下就简单了。
例如:
2 km -> mm
本质就是:
2 × 1000000
再比如:
5 kg -> g
本质就是:
5 × 1000000 ÷ 1000
于是可以得到统一公式:
答案=x×value1÷value2
这个思路非常重要。
因为很多算法题,本质都是:
“统一标准”
例如:
时间统一成秒
金额统一成分
距离统一成米
统一之后,计算会简单很多。
写法一:不用 map
很多初学者刚接触 C++ 时,对 STL 还不熟。
那么其实可以直接写函数。
完整代码
#include <iostream>
using namespace std;
long long getValue(string s)
{
if (s == "km" || s == "kg")
{
return 1000000;
}
if (s == "m" || s == "g")
{
return 1000;
}
return 1;
}
int main()
{
int n;
cin >> n;
while (n--)
{
long long x;
string a, b;
char ch;
cin >> x >> a >> ch >> ch >> b;
long long v1 = getValue(a);
long long v2 = getValue(b);
long long ans = x * v1 / v2;
cout << x << " " << a
<< " = "
<< ans << " "
<< b << endl;
}
return 0;
}这种写法的优点
最大的特点:
好理解
尤其适合:
刚学函数
刚学字符串
还不熟 STL
的人。
逻辑也非常直接:
if (s == "km")
一眼就能看懂。
缺点也很明显
如果单位越来越多:
cm
ton
inch
pound
代码会越来越长。
后期维护比较麻烦。
写法二:使用 map
接下来看看更常见的竞赛写法。
完整代码
#include <iostream>
#include <map>
using namespace std;
int main()
{
int n;
cin >> n;
map<string, long long> mp;
mp["km"] = 1000000;
mp["m"] = 1000;
mp["mm"] = 1;
mp["kg"] = 1000000;
mp["g"] = 1000;
mp["mg"] = 1;
while (n--)
{
long long x;
string a, b;
char ch;
cin >> x >> a >> ch >> ch >> b;
long long ans = x * mp[a] / mp[b];
cout << x << " " << a
<< " = "
<< ans << " "
<< b << endl;
}
return 0;
}map 到底是什么
可以理解成:
“对应关系表”
例如:
mp["km"] = 1000000;
意思就是:
km 对应 1000000
再比如:
mp["m"] = 1000;
意思就是:
m 对应 1000
以后:
mp[a]
就能直接拿到对应值。
map 写法的优势
最大的优点:
扩展性强
以后新增单位:
mp["cm"] = 10;
直接加一行即可。
代码主体完全不用改。
这就是数据结构带来的好处。
两种写法怎么选
其实没有绝对答案。
初学阶段
更推荐:
if + 函数
因为容易理解。
竞赛或项目阶段
更推荐:
map
因为:
代码更短
更灵活
更容易扩展
这道题真正重要的地方
很多人以为这题是在考:
字符串
map
输入输出
其实都不是。
真正核心的是:
建模能力
也就是:
如何把复杂问题转换成统一问题
这是一种非常重要的算法思维。
例如:
时间问题:
1小时20分钟30秒
很多高手会先统一成秒。
金额问题:
12元5角3分
很多高手会统一成“分”。
因为:
统一之后,所有计算都会变简单。
这才是这道题最值得学的地方。

- 上一篇:彻底搞懂时间复杂度和空间复杂度
- 下一篇:
