E卷-货币单位换算-(100分)

E卷-刷题笔记合集🔗

货币单位换算

问题描述

在一个多国货币记账本中,记录了若干条不同货币的金额。现在需要将这些金额全部转换成人民币分(fen),并进行汇总。每条记录可能包含单独的元、单独的分,或者元与分的组合。转换时,需要考虑不同货币之间的汇率关系。

要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃。元和分的换算关系都是1:100,如下:1CNY=100fen(1元=100分) 1HKD=100cents(1港元=100港分) 1JPY=100sen(1日元=100仙) 1EUR=100eurocents(1欧元=100欧分) 1GBP=100pence(1英镑=100便士)汇率表如下:

CNY JPY HKD EUR GBP
100 1825 123 14 12

即:100CNY = 1825JPY = 123HKD = 14EUR = 12GBP

输入格式

第一行输入一个整数 ,表示记录的条数,其中

接下来的 行,每行包含一条货币记录,格式为数字加单位。每行只会出现一种货币。

输出格式

输出一个整数,表示将所有货币转换成人民币分(fen)后的汇总结果。结果只保留整数部分,小数部分舍弃。

样例输入1

1
100CNY

样例输出1

10000

样例输入2

1
3000fen

样例输出2

3000

样例输入3

1
123HKD

样例输出3

10000

样例输入4

2
20CNY53fen
53HKD87cents

样例输出4

6432

样例解释

样例 解释说明
样例1 100CNY 转换后是 10000fen,所以输出结果为 10000。
样例2 3000fen 就是 3000,无需转换。
样例3 HKD 与 CNY 的汇率关系是 123:100,所以 123HKD 换算后,输出结果为 10000。
样例4 20元53分 + 53港元87港分,换算成人民币分后汇总,为 6432。

数据范围

  • 货币金额不超过

题解

模拟+正则表达式

这道题目的核心在于正确解析输入的货币字符串,并根据不同货币的汇率进行转换。解题思路如下:

  1. 首先,需要建立一个汇率表,记录各种货币与人民币的兑换比例。

  2. 使用正则表达式来解析输入的货币字符串。这是因为输入格式多样,可能包含元、分或两者的组合。正则表达式能够灵活地匹配这些不同的格式。

  3. 对于每一条货币记录,先将其转换为该货币的最小单位(如分、cents等),然后根据汇率转换为人民币分。

  4. 将所有转换后的金额累加,得到最终结果。

  5. 输出结果时,只保留整数部分。

参考代码

  • Python
import math

def convert_currency(records):
    # 汇率转换表,从各货币单位到人民币分
    exchange_rates = {
        "CNY": 100,            # 人民币:1元 = 100分
        "fen": 1,              # 人民币分
        "HKD": 100 / 123 * 100, # 港币:100港元 = 123人民币
        "cents": 100 / 123,    # 港币分
        "JPY": 100 / 1825 * 100, # 日元:100日元 = 1825人民币
        "sen": 100 / 1825,     # 日元仙
        "EUR": 100 / 14 * 100, # 欧元:100欧元 = 14人民币
        "eurocents": 100 / 14, # 欧元分
        "GBP": 100 / 12 * 100, # 英镑:100英镑 = 12人民币
        "pence": 100 / 12      # 英镑便士
    }
    
    total_fen = 0  # 总的人民币分数
    combined_string = "".join(records) + "0"  # 将所有输入行合成一个字符串,后面补一个0方便最后解析
    current_num = ""  # 当前解析的数字部分
    current_unit = "" # 当前解析的单位部分
    
    for char in combined_string:
        if char.isdigit():  # 如果遇到数字
            if current_unit:  # 如果当前单位不为空
                # 开始计算这一段的货币换算
                total_fen += int(current_num) * exchange_rates[current_unit]
                current_num = ""  # 清空当前数字部分
                current_unit = "" # 清空当前单位部分
            current_num += char  # 追加新的数字
        elif char.isalpha():  # 如果遇到字母
            current_unit += char  # 追加到单位部分
    
    return math.floor(total_fen)  # 返回向下取整的结果

# 输入处理
n = int(input())  # 读取记录数量
records = [input() for _ in range(n)]  # 读取每行记录

# 调用函数并输出结果
result = convert_currency(records)
print(result)
  • Java
import java.util.*;

public class CurrencyConverter {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  // 读取记录数量
        scanner.nextLine();  // 消耗换行符
        
        List<String> records = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            records.add(scanner.nextLine());  // 读取每行记录
        }
        
        long result = convertCurrency(records);
        System.out.println(result);
        
        scanner.close();
    }
    
    public static long convertCurrency(List<String> records) {
        // 汇率转换表,从各货币单位到人民币分
        Map<String, Double> exchangeRates = new HashMap<>();
        exchangeRates.put("CNY", 100.0);
        exchangeRates.put("fen", 1.0);
        exchangeRates.put("HKD", 100.0 / 123 * 100);
        exchangeRates.put("cents", 100.0 / 123);
        exchangeRates.put("JPY", 100.0 / 1825 * 100);
        exchangeRates.put("sen", 100.0 / 1825);
        exchangeRates.put("EUR", 100.0 / 14 * 100);
        exchangeRates.put("eurocents", 100.0 / 14);
        exchangeRates.put("GBP", 100.0 / 12 * 100);
        exchangeRates.put("pence", 100.0 / 12);
        
        double totalFen = 0;  // 总的人民币分数
        StringBuilder combinedString = new StringBuilder();
        for (String record : records) {
            combinedString.append(record);
        }
        combinedString.append("0");  // 在末尾添加0方便最后解析
        
        StringBuilder currentNum = new StringBuilder();  // 当前解析的数字部分
        StringBuilder currentUnit = new StringBuilder(); // 当前解析的单位部分
        
        for (char c : combinedString.toString().toCharArray()) {
            if (Character.isDigit(c)) {  // 如果遇到数字
                if (currentUnit.length() > 0) {  // 如果当前单位不为空
                    // 开始计算这一段的货币换算
                  

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

被普调的六边形战士很高大:项目经历貌似和专业或者求职方向没大关系?
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客企业服务