(A卷,100分)- 货币单位换算(Java & JS & Python)

题目描述

记账本上记录了若干条多国货币金额,需要转换成人民币分(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

评论0

站点公告

没有账号?注册  忘记密码?