题目描述
记账本上记录了若干条多国货币金额,需要转换成人民币分(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)后汇总求和,只保留整数部分。
输出格式只有整数数字,不带小数,不带单位。
用例
输入 | 1 100CNY |
输出 | 10000 |
说明 | 100CNY转换后是10000fen,所以输出结果为10000 |
输入 | 1 3000fen |
输出 | 3000 |
说明 | 3000fen,结果就是3000 |
输入 | 1 123HKD |
输出 | 10000 |
说明 | HKD与CNY的汇率关系是123:100,所以换算后,输出结果为10000 |
输入 | 2 20CNY53fen 53HKD87cents |
输出 | 6432 |
说明 | 20元53分 + 53港元87港分,换算成人民币分后汇总,为6432 |
题目解析
纯逻辑题。
本题唯一的难度应该在于如何解析输入字符串中的金额和单位,这里最好是使用正则表达式:
剩下的就是将不同单位转换成人民币分的汇率计算工作了,如下源码中exchange记录的不同单位转成人民币分的汇率。
JavaScript算法源码
正则解法
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
let n;
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 1) {
n = lines[0] - 0;
}
if (n && lines.length === n + 1) {
lines.shift();
console.log(getResult(lines));
lines.length = 0;
}
});
function getResult(arr) {
const regExp =
/(d+)((CNY)|(JPY)|(HKD)|(EUR)|(GBP)|(fen)|(cents)|(sen)|(eurocents)|(pence))/g;
const exchange = {
CNY: 100,
JPY: (100 / 1825) * 100,
HKD: (100 / 123) * 100,
EUR: (100 / 14) * 100,
GBP: (100 / 12) * 100,
fen: 1,
cents: 100 / 123,
sen: 100 / 1825,
eurocents: 100 / 14,
pence: 100 / 12,
};
let ans = 0;
arr.forEach((str) => {
while (true) {
const res = regExp.exec(str);
if (!res) break;
const [_, amount, unit] = res;
ans += amount * exchange[unit];
}
});
return Math.floor(ans);
}
非正则解法
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
let n;
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 1) {
n = lines[0] - 0;
}
if (n && lines.length === n + 1) {
lines.shift();
console.log(getResult(lines));
lines.length = 0;
}
});
function getResult(arr) {
const exchange = {
CNY: 100,
JPY: (100 / 1825) * 100,
HKD: (100 / 123) * 100,
EUR: (100 / 14) * 100,
GBP: (100 / 12) * 100,
fen: 1,
cents: 100 / 123,
sen: 100 / 1825,
eurocents: 100 / 14,
pence: 100 / 12,
};
const str = arr.join("") + "0";
let ans = 0;
let num = "";
let unit = "";
for (let c of str) {
if (c >= "0" && c <= "9") {
if (unit != "") {
ans += Number(num) * exchange[unit];
num = "";
unit = "";
}
num += c;
} else if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) {
unit += c;
}
}
return Math.floor(ans);
}
Java算法源码
正则解法
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.next();
}
System.out.println(getResult(arr));
}
public static int getResult(String[] arr) {
String reg = "(\d+)((CNY)|(JPY)|(HKD)|(EUR)|(GBP)|(fen)|(cents)|(sen)|(eurocents)|(pence))";
HashMap<String, Double> exchange = new HashMap<>();
exchange.put("CNY", 100.0);
exchange.put("JPY", 100.0 / 1825 * 100);
exchange.put("HKD", 100.0 / 123 * 100);
exchange.put("EUR", 100.0 / 14 * 100);
exchange.put("GBP", 100.0 / 12 * 100);
exchange.put("fen", 1.0);
exchange.put("cents", 100.0 / 123);
exchange.put("sen", 100.0 / 1825);
exchange.put("eurocents", 100.0 / 14);
exchange.put("pence", 100.0 / 12);
double ans = 0.0;
Pattern p = Pattern.compile(reg);
for (String s : arr) {
Matcher m = p.matcher(s);
while (true) {
if (m.find()) {
Double amount = Double.parseDouble(m.group(1));
String unit = m.group(2);
ans += amount * exchange.get(unit);
} else {
break;
}
}
}
return (int) ans;
}
}
非正则解法
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.next();
}
System.out.println(getResult(arr));
}
public static int getResult(String[] arr) {
HashMap<String, Double> exchange = new HashMap<>();
exchange.put("CNY", 100.0);
exchange.put("JPY", 100.0 / 1825 * 100);
exchange.put("HKD", 100.0 / 123 * 100);
exchange.put("EUR", 100.0 / 14 * 100);
exchange.put("GBP", 100.0 / 12 * 100);
exchange.put("fen", 1.0);
exchange.put("cents", 100.0 / 123);
exchange.put("sen", 100.0 / 1825);
exchange.put("eurocents", 100.0 / 14);
exchange.put("pence", 100.0 / 12);
double ans = 0.0;
StringBuilder sb = new StringBuilder();
for (String s : arr) sb.append(s);
String str = sb.toString() + "0";
StringBuilder num = new StringBuilder();
StringBuilder unit = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c >= '0' && c <= '9') {
if (unit.length() != 0) {
ans += Integer.parseInt(num.toString()) * exchange.get(unit.toString());
num = new StringBuilder();
unit = new StringBuilder();
}
num.append(c);
} else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
unit.append(c);
}
}
return (int) ans;
}
}
Python算法源码
正则解法
import math
import re
# 输入获取
n = int(input())
arr = [input() for i in range(n)]
# 算法入口
def getResult(arr):
pattern = r"(d+)((CNY)|(JPY)|(HKD)|(EUR)|(GBP)|(fen)|(cents)|(sen)|(eurocents)|(pence))"
exchage = {
"CNY": 100,
"JPY": 100 / 1825 * 100,
"HKD": 100 / 123 * 100,
"EUR": 100 / 14 * 100,
"GBP": 100 / 12 * 100,
"fen": 1,
"cents": 100 / 123,
"sen": 100 / 1825,
"eurocents": 100 / 14,
"pence": 100 / 12
}
ans = 0
for s in arr:
result = re.findall(pattern, s)
for item in result:
amount = item[0]
unit = item[1]
ans += int(amount) * exchage[unit]
return math.floor(ans)
# 算法调用
print(getResult(arr))
非正则解法
import math
import re
# 输入获取
n = int(input())
arr = [input() for i in range(n)]
# 算法入口
def getResult(arr):
exchage = {
"CNY": 100,
"JPY": 100 / 1825 * 100,
"HKD": 100 / 123 * 100,
"EUR": 100 / 14 * 100,
"GBP": 100 / 12 * 100,
"fen": 1,
"cents": 100 / 123,
"sen": 100 / 1825,
"eurocents": 100 / 14,
"pence": 100 / 12
}
ans = 0
s = "".join(arr) + "0"
num = ""
unit = ""
for c in s:
if "0" <= c <= "9":
if unit != "":
ans += int(num) * exchage[unit]
num = ""
unit = ""
num += c
elif "a" <= c <= "z" or "A" <= c <= "Z":
unit += c
return math.floor(ans)
# 算法调用
print(getResult(arr))
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0