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便士)汇率表如下:
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。 |
数据范围
- 货币金额不超过
题解
模拟+正则表达式
这道题目的核心在于正确解析输入的货币字符串,并根据不同货币的汇率进行转换。解题思路如下:
-
首先,需要建立一个汇率表,记录各种货币与人民币的兑换比例。
-
使用正则表达式来解析输入的货币字符串。这是因为输入格式多样,可能包含元、分或两者的组合。正则表达式能够灵活地匹配这些不同的格式。
-
对于每一条货币记录,先将其转换为该货币的最小单位(如分、cents等),然后根据汇率转换为人民币分。
-
将所有转换后的金额累加,得到最终结果。
-
输出结果时,只保留整数部分。
参考代码
- 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%内容,订阅专栏后可继续查看/也可单篇购买
本专栏收集并整理了一些刷题笔记