首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【华为OD-E卷 -33 货币单位换算 100分(python、java、c++、js、c)】

  • 25-03-07 19:21
  • 3661
  • 8212
blog.csdn.net

【华为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解法

  • 解题思路

  • 本题要求将一组货币金额记录转换为 fen,并求出它们的总和。输入的数据是每条记录由一个金额和一个货币单位组成,货币单位有很多种,需要根据不同的货币单位进行汇率转换。

主要步骤:
读取输入:

先输入一个整数 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解法

  • 解题思路

  • 本题要求将输入的货币金额记录转换为 fen 单位,并计算所有金额的总和。每条记录包含一个金额和一个货币单位,目标是根据单位进行转换并计算总和。

主要步骤:
读取输入:

第一行输入一个整数 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

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144772954"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top