#P3056. 货币单位换算(100分)
-
1000ms
Tried: 203
Accepted: 44
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