【华为OD-E卷 - 货币单位换算 100分(python、java、c++、js、c)】
题目
记账本上记录了若干条多国货币金额,需要转换成人民币分(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
输入描述
- 第一行输入为N,N表示记录数。0
之后N行,每行表示一条货币记录,且该行只会是一种货币
输出描述
- 将每行货币转换成人民币分(fen)后汇总求和,只保留整数部分。
输出格式只有整数数字,不带小数,不带单位
用例
用例一:
输入:
1
100CNY
- 1
- 2
输出:
10000
- 1
用例二:
输入:
1
3000fen
- 1
- 2
输出:
3000
- 1
用例三:
输入:
1
123HKD
- 1
- 2
输出:
10000
- 1
用例四:
输入:
2
20CNY53fen
53HKD87cents
- 1
- 2
- 3
输出:
6432
- 1
python解法
- 解题思路:
- 本题要求将多条记录中的货币金额转换为分(fen),并求得总金额。每条记录包含不同的货币及其金额。我们需要根据不同货币的汇率将其统一转换成分(fen),然后累加所有金额。
解决步骤:
定义汇率转换表:
题目提供了不同货币到 fen 的汇率,我们需要用字典 rates 存储这些汇率。每种货币对应其兑换成 fen 的比率。例如,1 CNY = 100 fen;1 JPY = 100 / 1825 fen,依此类推。
正则表达式提取货币和金额:
对每条记录使用正则表达式 re.findall 来提取金额和货币。正则表达式 (\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence) 会匹配形如 123CNY、456JPY 这样的字符串,提取出数字部分和货币部分。
汇率转换:
对于每条记录中的所有金额和货币,我们用相应货币的汇率将其转换为 fen。根据汇率将金额乘以汇率,得到该货币的 fen 结果。
求和:
将所有转换成 fen 的金额加起来,得到总金额。
返回结果:
返回总金额并转换为整数。
import re # 导入正则表达式模块,用于提取金额和货币
def convert_currency_to_fen(records):
# 定义各个货币与fen的兑换比例
rates = {
"CNY": 100, # 1 CNY = 100 fen
"JPY": 100 / 1825 * 100, # 1 JPY = 100 / 1825 * 100 fen
"HKD": 100 / 123 * 100, # 1 HKD = 100 / 123 * 100 fen
"EUR": 100 / 14 * 100, # 1 EUR = 100 / 14 * 100 fen
"GBP": 100 / 12 * 100, # 1 GBP = 100 / 12 * 100 fen
"fen": 1, # 1 fen = 1 fen
"cents": 100 / 123, # 1 cent = 100 / 123 fen
"sen": 100 / 1825, # 1 sen = 100 / 1825 fen
"eurocents": 100 / 14, # 1 eurocent = 100 / 14 fen
"pence": 100 / 12 # 1 pence = 100 / 12 fen
}
# 使用正则表达式提取每条记录中的金额和货币类型,并根据汇率转换成fen,计算总和
total_fen = sum(int(amount) * rates[currency] # 计算每条记录的fen值
for record in records # 遍历每条记录
for amount, currency in re.findall( # 提取金额和货币
r"(\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)", record)) # 匹配金额和货币
return int(total_fen) # 返回总金额(取整)
# 读取输入
n = int(input()) # 记录的条数
records = [input() for _ in range(n)] # 读取每一条记录
# 输出总金额
print(convert_currency_to_fen(records))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
java解法
- 解题思路
- 本题要求将多条记录中的货币金额转换为分(fen),并求得总金额。每条记录包含不同的货币及其金额。我们需要根据不同货币的汇率将其统一转换成分(fen),然后累加所有金额。
解决步骤:
定义汇率转换表:
题目给出了不同货币到 fen 的汇率。我们需要用一个 Map 存储这些汇率。每种货币都对应一个兑换成 fen 的比率。例如,1 CNY = 100 fen;1 JPY = 100 / 1825 fen,依此类推。
正则表达式提取货币和金额:
每条记录中可能包含多个货币及其金额,我们可以使用正则表达式 Pattern 来匹配记录中的金额和货币。通过正则表达式提取出数字部分(金额)和货币部分(如 CNY、JPY 等)。
汇率转换:
对于每条记录中的每一对 (amount, currency),我们根据 rates 中的汇率将金额转换为 fen。然后将所有金额累加得到总金额。
返回结果:
由于结果可能是浮动值,我们将其转换为整数并返回。返回值表示所有货币金额转换为 fen 后的总和。
import java.util.*;
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
// 创建Scanner对象读取输入
Scanner sc = new Scanner(System.in);
// 读取记录的条数
int n = sc.nextInt();
sc.nextLine(); // 读取换行符
// 读取所有记录
String[] rec = new String[n];
for (int i = 0; i < n; i++) {
rec[i] = sc.nextLine();
}
// 创建货币转换器对象
CurrencyConverter converter = new CurrencyConverter();
// 输出转换后的总金额
System.out.println(converter.convertToFen(rec));
}
}
class CurrencyConverter {
private final Map<String, Double> rates; // 存储货币到fen的汇率
private final Pattern regex; // 用于匹配金额和货币的正则表达式
// 构造函数,初始化汇率表
public CurrencyConverter() {
rates = new HashMap<>();
// 设置各货币与fen的汇率
rates.put("CNY", 100.0); // 1 CNY = 100 fen
rates.put("JPY", 100.0 / 1825 * 100); // 1 JPY = 100 / 1825 * 100 fen
rates.put("HKD", 100.0 / 123 * 100); // 1 HKD = 100 / 123 * 100 fen
rates.put("EUR", 100.0 / 14 * 100); // 1 EUR = 100 / 14 * 100 fen
rates.put("GBP", 100.0 / 12 * 100); // 1 GBP = 100 / 12 * 100 fen
rates.put("fen", 1.0); // 1 fen = 1 fen
rates.put("cents", 100.0 / 123); // 1 cent = 100 / 123 fen
rates.put("sen", 100.0 / 1825); // 1 sen = 100 / 1825 fen
rates.put("eurocents", 100.0 / 14); // 1 eurocent = 100 / 14 fen
rates.put("pence", 100.0 / 12); // 1 pence = 100 / 12 fen
// 定义正则表达式用于匹配货币和金额
regex = Pattern.compile("(\\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)");
}
// 将记录转换为fen并求和
public int convertToFen(String[] rec) {
double total = 0; // 初始化总金额为0
// 遍历所有记录
for (String r : rec) {
Matcher matcher = regex.matcher(r); // 获取正则匹配器
while (matcher.find()) { // 在记录中查找符合条件的金额和货币
int amount = Integer.parseInt(matcher.group(1)); // 获取金额部分
String currency = matcher.group(2); // 获取货币类型
total += amount * rates.get(currency); // 累加转换后的fen金额
}
}
return (int) total; // 返回总金额,转换为整数
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
C++解法
- 解题思路
更新中
- 1
C解法
主要步骤:
读取输入:
先输入一个整数 n,表示记录的数量。
接着读取 n 条记录,每条记录包含一个金额和一个货币单位。
货币单位汇率转换:
根据不同的货币单位(如 CNY、JPY、HKD 等),将金额转换为 fen。汇率通过 getRate 函数获得。
汇率已知,1 CNY = 100 fen,1 JPY = 100/1825 * 100 fen 等。
解析记录:
每条记录中包括一个金额和货币单位。通过遍历记录字符串,将数字部分作为金额,字母部分作为货币单位。
使用 getRate 函数将金额转换为 fen 并累加。
输出结果:
最后,输出转换后的总 fen 数量(取整后输出)。
#include
#include
#include
// 函数:根据货币单位返回相应的汇率,所有的汇率都相对于 fen
double getRate(const char* unt) {
// 判断输入的货币单位并返回相应的汇率
if (strcmp(unt, "CNY") == 0)
return 100.0; // 1 CNY = 100 fen
else if (strcmp(unt, "JPY") == 0)
return 100.0 / 1825 * 100; // 1 JPY = 100 / 1825 * 100 fen
else if (strcmp(unt, "HKD") == 0)
return 100.0 / 123 * 100; // 1 HKD = 100 / 123 * 100 fen
else if (strcmp(unt, "EUR") == 0)
return 100.0 / 14 * 100; // 1 EUR = 100 / 14 * 100 fen
else if (strcmp(unt, "GBP") == 0)
return 100.0 / 12 * 100; // 1 GBP = 100 / 12 * 100 fen
else if (strcmp(unt, "fen") == 0)
return 1.0; // 1 fen = 1 fen
else if (strcmp(unt, "cents") == 0)
return 100.0 / 123; // 1 cent = 100 / 123 fen
else if (strcmp(unt, "sen") == 0)
return 100.0 / 1825; // 1 sen = 100 / 1825 fen
else if (strcmp(unt, "eurocents") == 0)
return 100.0 / 14; // 1 eurocent = 100 / 14 fen
else if (strcmp(unt, "pence") == 0)
return 100.0 / 12; // 1 pence = 100 / 12 fen
else
return 0.0; // 如果货币单位无法识别,返回0
}
int main() {
int n;
scanf("%d", &n); // 读取记录的数量
getchar(); // 读取换行符
double total = 0; // 用于存储总金额
// 逐条处理记录
for (int i = 0; i < n; i++) {
char rec[100]; // 用于存储一条记录
fgets(rec, 100, stdin); // 读取一行记录
int amt = 0; // 用于存储金额
char unt[20] = ""; // 用于存储货币单位
int len = strlen(rec); // 获取记录的长度
// 逐字符遍历记录
for (int j = 0; j < len; j++) {
char c = rec[j];
// 如果是数字字符,则累加到 amt(金额)中
if (isdigit(c)) {
amt = amt * 10 + (c - '0');
}
// 如果是字母字符,表示货币单位,提取出完整的货币单位
else if (isalpha(c)) {
int k = 0;
while (j < len && isalpha(rec[j])) { // 提取连续字母组成的货币单位
unt[k++] = rec[j++];
}
unt[k] = '\0'; // 结束字符
// 根据提取的货币单位计算金额,并累加到总金额中
total += amt * getRate(unt);
amt = 0; // 重置金额
unt[0] = '\0'; // 清空货币单位
j--; // 回退一位,因为 j 在 while 循环结束后会多进一位
}
}
}
// 输出总金额(取整后输出)
printf("%d\n", (int)total);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
JS解法
主要步骤:
读取输入:
第一行输入一个整数 n,表示记录的数量。
接着读取 n 条记录,每条记录包含一个金额和货币单位。
货币单位汇率转换:
使用汇率字典 rates 将不同货币单位转换为 fen 单位。
汇率的转换基于给定的货币与 fen 的比例。例如 1 CNY = 100 fen,1 JPY = 100 / 1825 * 100 fen 等。
解析记录:
使用正则表达式从每条记录中提取出金额和货币单位。
根据货币单位从 rates 中查找相应的汇率,将金额转换为 fen 并累加到总和 sum 中。
输出结果:
最后,输出所有记录对应金额的总和,取整后返回
const rl = require("readline").createInterface({
input: process.stdin, // 设置标准输入
output: process.stdout, // 设置标准输出
});
const records = []; // 用于存储输入的记录
rl.on("line", (line) => {
records.push(line); // 每次读取一行,保存到 records 数组中
if (records.length === parseInt(records[0]) + 1) { // 判断是否已经读入所有记录
records.shift(); // 移除第一行,它是记录的数量
console.log(computeTotalFen(records)); // 调用函数计算总金额并输出
rl.close(); // 关闭输入流
}
});
// 计算所有记录转换为 fen 后的总金额
function computeTotalFen(entries) {
// 汇率字典,定义了各个货币单位与 fen 的转换关系
const rates = {
CNY: 100, // CNY 1 = 100 fen
JPY: (100 / 1825) * 100, // JPY 1 = 100 / 1825 * 100 fen
HKD: (100 / 123) * 100, // HKD 1 = 100 / 123 * 100 fen
EUR: (100 / 14) * 100, // EUR 1 = 100 / 14 * 100 fen
GBP: (100 / 12) * 100, // GBP 1 = 100 / 12 * 100 fen
fen: 1, // fen 1 = 1 fen
cents: 100 / 123, // cents 1 = 100 / 123 fen
sen: 100 / 1825, // sen 1 = 100 / 1825 fen
eurocents: 100 / 14, // eurocents 1 = 100 / 14 fen
pence: 100 / 12, // pence 1 = 100 / 12 fen
};
// 正则表达式:用于匹配记录中的金额和货币单位
const currencyPattern = /(\d+)((CNY)|(JPY)|(HKD)|(EUR)|(GBP)|(fen)|(cents)|(sen)|(eurocents)|(pence))/g;
let sum = 0; // 用于存储所有金额的总和
// 遍历每条记录
for (const record of entries) {
let result;
// 使用正则表达式匹配记录中的金额和货币单位
while ((result = currencyPattern.exec(record)) !== null) {
const amount = parseInt(result[1]); // 获取金额部分
const unit = result[2]; // 获取货币单位
sum += amount * rates[unit]; // 根据汇率转换并累加到总金额
}
}
// 返回总金额,取整
return Math.floor(sum);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: