当前位置:首页GESP > 正文

从单位换算题,聊聊 C++ 里的两种写法:map 与 非 map

作者:野牛程序员:2026-05-14 09:39:27GESP阅读 1994
从单位换算题,聊聊 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

单位
km1000000
m1000
mm1

重量统一成 mg

单位
kg1000000
g1000
mg1

这样问题一下就简单了。

例如:

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分

很多高手会统一成“分”。

因为:

统一之后,所有计算都会变简单。

这才是这道题最值得学的地方。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 从单位换算题,聊聊 C++ 里的两种写法:map 与 非 map
  • 相关推荐

    最新推荐

    热门点击