2024华为OD试题及答案-A018-货币单位换算

题目描述

记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。
每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分,或者元与分的组合。
要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃。
元和分的换算关系都是1:100,如下:

1CNY=100fen(1元=100分)
1HKD=100cents(1港元=100港分)
1JPY=100sen(1日元=100仙)
1EUR=100eurocents(1欧元=100欧分)
1GBP=100pence(1英镑=100便士)

汇率表如下:

CNYJPYHKDEURGBP
10018251231412

即: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

题目解析

任务描述

我们需要将多种外币转换成人民币的分(fen),并汇总输出。每行记录包含一个外币金额,可能是单独的整数部分(例如100CNY),或者整数与分的组合(例如20CNY53fen)。最终结果只保留整数部分,输出不带单位。

汇率

  1. 1 CNY = 100 fen
  2. 1 HKD = 100 cents
  3. 1 JPY = 100 sen
  4. 1 EUR = 100 eurocents
  5. 1 GBP = 100 pence

汇率转换关系为:

  • 100 CNY = 1825 JPY
  • 100 CNY = 123 HKD
  • 100 CNY = 14 EUR
  • 100 CNY = 12 GBP

输入

  1. 第一行包含一个整数 N,表示记录数。
  2. 接下来的 N 行,每行是一条货币记录,目标货币只会是一种货币。

输出

将每行货币转换成人民币分(fen)后汇总求和,只保留整数部分。输出结果只有整数数字,不带小数、不带单位。

解题思路

  1. 解析输入:读取每条货币记录,并解析其金额和单位。
  2. 转换汇率:根据汇率将外币转换为人民币分(fen)。
  3. 汇总结果:累加所有记录的人民币分(fen),并输出结果。

示例

输入:

2
20CNY53fen
53HKD87cents

输出:

6432

解释:

  • 20CNY53fen 转换为人民币分是 2053 fen
  • 53HKD87cents 转换为人民币分是 4379 fen
  • 最终结果为 2053 + 4379 = 6432 fen

C++代码实现

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

// 汇率常量定义
const double JPY_TO_CNY = 100.0 / 1825.0;
const double HKD_TO_CNY = 100.0 / 123.0;
const double EUR_TO_CNY = 100.0 / 14.0;
const double GBP_TO_CNY = 100.0 / 12.0;

int main() {
    int N;
    cin >> N;
    cin.ignore(); // 忽略换行符

    int totalFen = 0;

    for (int i = 0; i < N; ++i) {
        string line;
        getline(cin, line);

        int cny = 0, fen = 0;
        double conversionRate = 1.0;
        
        // 检查货币类型并提取数值
        if (line.find("CNY") != string::npos) {
            size_t pos = line.find("CNY");
            cny = stoi(line.substr(0, pos));
            line = line.substr(pos + 3);
            if (line.find("fen") != string::npos) {
                pos = line.find("fen");
                fen = stoi(line.substr(0, pos));
            }
        } else if (line.find("HKD") != string::npos) {
            conversionRate = HKD_TO_CNY;
            size_t pos = line.find("HKD");
            cny = stoi(line.substr(0, pos));
            line = line.substr(pos + 3);
            if (line.find("cents") != string::npos) {
                pos = line.find("cents");
                fen = stoi(line.substr(0, pos));
            }
        } else if (line.find("JPY") != string::npos) {
            conversionRate = JPY_TO_CNY;
            size_t pos = line.find("JPY");
            cny = stoi(line.substr(0, pos));
            line = line.substr(pos + 3);
            if (line.find("sen") != string::npos) {
                pos = line.find("sen");
                fen = stoi(line.substr(0, pos));
            }
        } else if (line.find("EUR") != string::npos) {
            conversionRate = EUR_TO_CNY;
            size_t pos = line.find("EUR");
            cny = stoi(line.substr(0, pos));
            line = line.substr(pos + 3);
            if (line.find("eurocents") != string::npos) {
                pos = line.find("eurocents");
                fen = stoi(line.substr(0, pos));
            }
        } else if (line.find("GBP") != string::npos) {
            conversionRate = GBP_TO_CNY;
            size_t pos = line.find("GBP");
            cny = stoi(line.substr(0, pos));
            line = line.substr(pos + 3);
            if (line.find("pence") != string::npos) {
                pos = line.find("pence");
                fen = stoi(line.substr(0, pos));
            }
        }

        // 转换为人民币分
        int totalCNYFen = cny * 100 + fen;
        int totalRMBFen = totalCNYFen * conversionRate;
        totalFen += totalRMBFen;
    }

    // 输出结果
    cout << totalFen << endl;

    return 0;
}

代码说明

  1. 汇率常量定义:定义外币与人民币的汇率常量。
  2. 解析输入:读取输入行数N,并逐行解析每条货币记录,提取金额和单位。
  3. 转换汇率:根据提取的金额和汇率常量,将外币转换为人民币分(fen)。
  4. 汇总结果:累加所有记录转换后的人民币分(fen),并输出最终结果。

python代码实现

def convert_currency_to_fen(currency_record):
    # 汇率常量定义
    JPY_TO_CNY = 100 / 1825
    HKD_TO_CNY = 100 / 123
    EUR_TO_CNY = 100 / 14
    GBP_TO_CNY = 100 / 12

    cny = 0
    fen = 0
    conversion_rate = 1.0

    if "CNY" in currency_record:
        parts = currency_record.split("CNY")
        cny = int(parts[0])
        if "fen" in parts[1]:
            fen = int(parts[1].split("fen")[0])
    elif "HKD" in currency_record:
        conversion_rate = HKD_TO_CNY
        parts = currency_record.split("HKD")
        cny = int(parts[0])
        if "cents" in parts[1]:
            fen = int(parts[1].split("cents")[0])
    elif "JPY" in currency_record:
        conversion_rate = JPY_TO_CNY
        parts = currency_record.split("JPY")
        cny = int(parts[0])
        if "sen" in parts[1]:
            fen = int(parts[1].split("sen")[0])
    elif "EUR" in currency_record:
        conversion_rate = EUR_TO_CNY
        parts = currency_record.split("EUR")
        cny = int(parts[0])
        if "eurocents" in parts[1]:
            fen = int(parts[1].split("eurocents")[0])
    elif "GBP" in currency_record:
        conversion_rate = GBP_TO_CNY
        parts = currency_record.split("GBP")
        cny = int(parts[0])
        if "pence" in parts[1]:
            fen = int(parts[1].split("pence")[0])

    total_fen = (cny * 100 + fen) * conversion_rate
    return int(total_fen)

# 读取输入
N = int(input().strip())
total_fen = 0

for _ in range(N):
    currency_record = input().strip()
    total_fen += convert_currency_to_fen(currency_record)

# 输出结果
print(total_fen)

代码说明

  1. convert_currency_to_fen函数:该函数处理单个货币记录字符串,提取金额并转换为人民币分(fen)。
  2. 汇率常量定义:定义外币与人民币的汇率常量。
  3. 解析输入:读取输入的记录数 NNN 及每条货币记录,并调用 convert_currency_to_fen 函数进行转换。
  4. 汇总结果:累加所有记录转换后的人民币分(fen),并输出最终结果。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值