一、题目描述
记账本上记录了若干条多国货币金额,需要转换成人民币分 (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<100之后N行,每行表示一条货币记录,且该行只会是一种货币。
三、输出描述
将每行货币转换成人民币分 (fen) 后汇总求和,只保留整数部分输出格式只有整数数字,不带小数,不带单位。
四、解题思路
- 读取输入的记录数 N;
- 创建一个变量 total,用于存储汇总结果;
- 使用正则表达式匹配每条记录中的金额和货币单位;
- 根据货币单位和对应的汇率,将金额转换成人民币分;
- 将转换后的金额加到 total 中;
- 输出 total 的整数部分,舍弃小数部分。
五、JavaScript算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 汇总结果
double total = 0.0;
int count = Integer.parseInt(sc.nextLine());
Pattern pattern = Pattern.compile("(\\d+(?:\\.\\d+)?)([A-Za-z]+)");
for (int i = 0; i < count; i++) {
String line = sc.nextLine();
// 使用正则表达式匹配每条记录中的金额和货币单位
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
// 根据货币单位和对应的汇率,将金额转换成人民币分
double amount = Double.parseDouble(matcher.group(1));
String currency = matcher.group(2);
// 将转换后的金额加到 total 中
total += exchange(currency, amount);
}
}
// 输出 total 的整数部分,舍弃小数部分
System.out.println(Math.round(Math.floor(total)));
}
private static double exchange(String currency, double amount) {
Map<String, Double> map = new HashMap<String, Double>() {{
put("CNY", 100.0);
put("fen", 1.0);
put("JPY", 10000.0 / 1825);
put("sen", 100.0 / 1825);
put("HKD", 10000.0 / 123);
put("cents", 100.0 / 123);
put("EUR", 10000.0 / 14);
put("eurocents", 100.0 / 14);
put("GBP", 10000.0 / 12);
put("pence", 100.0 / 12);
}};
return map.getOrDefault(currency, 0.0) * amount;
}
六、效果展示
1、输入
1
100CNY
2、输出
10000
3、思路分析
100CNY转换后是10000fen,所以输出10000。
4、输入
2
10CNY60fen
99HKD88cents
5、输出
9180
6、思路分析
2
10CNY60fen
99HKD88cents
演变为
10元60分+99港元88港分
演变为
10100+60+9910000/123 +88*100/123
输出
9180
🏆下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。