#P3056. 货币单位换算(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 186
            Accepted: 43
            Difficulty: 4
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>模拟          
 
货币单位换算(100分)
题目描述
在一个记账本中,记录了若干条多国货币的金额,格式为数字+单位。单位可以是人民币(CNY)、日元(JPY)、港元(HKD)、欧元(EUR)、英镑(GBP)及其子单位(fen、cents、sen、eurocents、pence)。任务是将所有货币金额转换为人民币分(fen),并进行汇总输出。汇率如下:
- 1 CNY = 100 fen
 - 1 JPY = 100 sen = 100 / 1825 CNY
 - 1 HKD = 100 cents = 100 / 123 CNY
 - 1 EUR = 100 eurocents = 100 / 14 CNY
 - 1 GBP = 100 pence = 100 / 12 CNY
 
输入格式
- 第一行输入一个整数 N (0 < N < 100),表示记录数。
 - 接下来的 N 行,每行包含一条货币记录。
 
输出格式
- 输出总和,仅保留整数部分,不带小数和单位。
 
题解思路
- 
正则表达式匹配:
- 使用正则表达式提取输入中的金额和对应的货币单位。模式为 
(\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)。 
 - 使用正则表达式提取输入中的金额和对应的货币单位。模式为 
 - 
汇率映射:
- 定义一个映射表,将每种货币单位转换为人民币分。对于子单位,直接通过其对应的汇率进行转换。
 
 - 
累加总和:
- 遍历每条记录,使用正则表达式进行匹配,并将解析得到的金额转换为人民币分,最后累加到总和中。
 
 - 
输出结果:
- 将总和转换为整数并输出。
 
 
复杂度分析
- 时间复杂度:O(N * M),其中 N 是记录数,M 是每条记录的字符数。正则表达式的匹配时间与输入的长度成正比。
 - 空间复杂度:O(1),只使用了常量级别的额外空间来存储汇率映射和结果。
 
代码实现
C++
#include <bits/stdc++.h>
using namespace std;
int main() {
    // 定义正则表达式,用于匹配金额和货币单位
    regex currencyPattern(R"((\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence))");
    // 汇率映射表,单位为人民币分(fen)
    map<string, double> exchangeRates = {
        {"CNY", 100.0},                  // 人民币
        {"JPY", 100.0 / 1825 * 100},     // 日元
        {"HKD", 100.0 / 123 * 100},      // 港元
        {"EUR", 100.0 / 14 * 100},       // 欧元
        {"GBP", 100.0 / 12 * 100},       // 英镑
        {"fen", 1.0},                    // 人民币的分
        {"cents", 100.0 / 123},          // 港元的分
        {"sen", 100.0 / 1825},           // 日元的分
        {"eurocents", 100.0 / 14},       // 欧元的分
        {"pence", 100.0 / 12}            // 英镑的分
    };
    double totalInFen = 0;  // 用于累加总金额,单位为人民币分(fen)
    int recordCount;
    cin >> recordCount;  // 输入记录数
    for (int i = 0; i < recordCount; i++) {
        string record;
        cin >> record;  // 读取一条记录
        // 使用正则表达式查找金额和单位
        sregex_iterator it(record.begin(), record.end(), currencyPattern);
        sregex_iterator end;
        // 遍历所有匹配的金额和单位
        while (it != end) {
            smatch match = *it;  // 获取匹配结果
            double amount = stod(match[1]);  // 转换为浮点数金额
            string unit = match[2];  // 获取货币单位
            // 根据汇率将金额转换为人民币分并累加
            totalInFen += amount * exchangeRates[unit];
            it++;
        }
    }
    // 输出总金额(取整舍去小数部分)
    cout << static_cast<int>(totalInFen) << endl;
    return 0;
}
Java
import java.util.*;
import java.util.regex.*;
public class CurrencyConverter {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 定义正则表达式,用于匹配金额和货币单位
        Pattern pattern = Pattern.compile("(\\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)");
        
        // 汇率映射表,单位为人民币分(fen)
        Map<String, Double> exchangeRates = new HashMap<>();
        exchangeRates.put("CNY", 100.0);               // 人民币
        exchangeRates.put("JPY", 100.0 / 1825 * 100);  // 日元
        exchangeRates.put("HKD", 100.0 / 123 * 100);   // 港元
        exchangeRates.put("EUR", 100.0 / 14 * 100);    // 欧元
        exchangeRates.put("GBP", 100.0 / 12 * 100);    // 英镑
        exchangeRates.put("fen", 1.0);                 // 人民币的分
        exchangeRates.put("cents", 100.0 / 123);       // 港元的分
        exchangeRates.put("sen", 100.0 / 1825);        // 日元的分
        exchangeRates.put("eurocents", 100.0 / 14);    // 欧元的分
        exchangeRates.put("pence", 100.0 / 12);        // 英镑的分
        double totalInFen = 0; // 用于累加总金额,单位为人民币分(fen)
        int recordCount = scanner.nextInt();  // 输入记录数
        scanner.nextLine();  // 读取换行符
        for (int i = 0; i < recordCount; i++) {
            String record = scanner.nextLine();  // 读取一条记录
            Matcher matcher = pattern.matcher(record);  // 创建正则表达式匹配器
            // 遍历所有匹配的金额和单位
            while (matcher.find()) {
                double amount = Double.parseDouble(matcher.group(1));  // 转换为浮点数金额
                String unit = matcher.group(2);  // 获取货币单位
                // 根据汇率将金额转换为人民币分并累加
                totalInFen += amount * exchangeRates.get(unit);
            }
        }
        // 输出总金额(取整舍去小数部分)
        System.out.println((int) totalInFen);
    }
}
Python
import re
def main():
    # 汇率映射表,单位为人民币分(fen)
    exchange_rates = {
        "CNY": 100.0,                    # 人民币
        "JPY": 100.0 / 1825 * 100,       # 日元
        "HKD": 100.0 / 123 * 100,        # 港元
        "EUR": 100.0 / 14 * 100,         # 欧元
        "GBP": 100.0 / 12 * 100,         # 英镑
        "fen": 1.0,                      # 人民币的分
        "cents": 100.0 / 123,            # 港元的分
        "sen": 100.0 / 1825,             # 日元的分
        "eurocents": 100.0 / 14,         # 欧元的分
        "pence": 100.0 / 12,             # 英镑的分
    }
    total_in_fen = 0  # 用于累加总金额,单位为人民币分(fen)
    record_count = int(input())  # 输入记录数
    # 定义正则表达式,用于匹配金额和货币单位
    pattern = re.compile(r"(\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)")
    for _ in range(record_count):
        record = input().strip()  # 读取一条记录并去除空白字符
        matches = pattern.findall(record)  # 查找所有匹配的金额和单位
        # 遍历所有匹配的金额和单位
        for amount, unit in matches:
            total_in_fen += int(amount) * exchange_rates[unit]  # 根据汇率转换并累加
    # 输出总金额(取整舍去小数部分)
    print(int(total_in_fen))
if __name__ == "__main__":
    main()
        题目描述
记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。
每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分,或者元与分的组合。
要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃。
元和分的换算关系都是1:100,如下:
1CNY=100fen(1元=100分)
1HKD=100cents(1港元=100港分)
1JPY=100sen(1日元=100仙)
1EUR=100eurocents(1欧元=100欧分)
1GBP=100pence(1英镑=100便士)
汇率表如下:

即:100CNY = 1825JPY = 123HKD = 14EUR = 12GBP
输入描述
第一行输入为N,N表示记录数。0<N<100
之后N行,每行表示一条货币记录,且该行只会是一种货币。
输出描述
将每行货币转换成人民币分(fen)后汇总求和,只保留整数部分。
输出格式只有整数数字,不带小数,不带单位。
样例1
输入
1
100CNY
输出
10000
说明
100CNY转换后是10000fen,所以输出结果为10000
样例2
输入
1
3000fen
输出
3000
说明
3000fen,结果就是3000
样例3
输入
1
123HKD
输出
10000
说明
HKD与CNY的汇率关系是123:100,所以换算后,输出结果为10000
样例4
输入
2
20CNY53fen
53HKD87cents
输出
6432
说明
20元53分 + 53港元87港分,换算成人民币分后汇总,为6432