首页 > 编程语言 >华为OD机试-E卷100分 -货币单位换算Java & Python& JS & C++ & C

华为OD机试-E卷100分 -货币单位换算Java & Python& JS & C++ & C

时间:2024-11-03 13:16:52浏览次数:3  
标签:return Python OD else record Java 100.0 100 unit

最新华为OD机试

题目描述

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

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

汇率表如下:

即:100CNY = 1825JPY = 123HKD = 14EUR = 12GBP

CNYJPYHKDEURGBP
10018251231412

输入描述

第一行输入为N,N表示记录数。0<N<100

之后N行,每行表示一条货币记录,且该行只会是一种货币。

输出描述

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

示例1

输入

1
100CNY

输出

10000

说明

100CNY转换后是10000fen,所以输出结果为10000

示例2

输入

1
3000fen

输出

3000

说明

3000fen,结果就是3000

示例3

输入

1
123HKD

输出

10000

说明

HKD与CNY的汇率关系是123:100,所以换算后,输出结果为10000

示例4

输入

2
20CNY53fen
53HKD87cents

输出

6432

说明

20元53分 + 53港元87港分,换算成人民币分后汇总,为6432

解题思路

这题主要是拆解字符串,题目本身不难,按照题意写好分支判断即可。如果觉得代码复杂,可以考虑使用正则表达式来做。

Java

import java.util.Scanner;

public class CurrencyConverter {

    // 方法:根据货币单位返回其转换为人民币分的汇率
    public static double exChange(String unit) {
        switch (unit) {
            case "CNY":
                return 100.0; // 人民币
            case "JPY":
                return 100.0 / 1825 * 100; // 日元
            case "HKD":
                return 100.0 / 123 * 100; // 港元
            case "EUR":
                return 100.0 / 14 * 100; // 欧元
            case "GBP":
                return 100.0 / 12 * 100; // 英镑
            case "fen":
                return 1.0; // 人民币分
            case "cents":
                return 100.0 / 123; // 港元分
            case "sen":
                return 100.0 / 1825; // 日元分
            case "eurocents":
                return 100.0 / 14; // 欧元分
            case "pence":
                return 100.0 / 12; // 英镑分
            default:
                return 0.0; // 无效单位返回0
        }
    }
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建Scanner对象用于读取输入
        int n = Integer.parseInt(scanner.nextLine()); // 读取记录数
       
        
        double totalFen = 0; // 汇总结果

        // 处理每一条货币记录
        for (int i = 0; i < n; i++) {
            String record = scanner.nextLine(); // 读取每一行的记录
            int amount = 0; // 用于保存金额
            StringBuilder unit = new StringBuilder(); // 保存单位

            // 遍历当前行,逐个提取金额和单位
            for (int j = 0; j < record.length(); j++) {
                char c = record.charAt(j);
                if (Character.isDigit(c)) {
                    amount = amount * 10 + (c - '0'); // 构建数字
                } else {
                    unit.append(c); // 构建货币单位
                }

                // 当遇到完整的金额+单位时进行换算
                if (j == record.length() - 1 || Character.isDigit(record.charAt(j + 1)) && unit.length() > 0) {
                    totalFen += amount * exChange(unit.toString()); // 计算并累加到总数
                    amount = 0; // 重置金额
                    unit.setLength(0); // 清空单位
                }
            }
        }

        // 输出汇总结果,只保留整数部分
        System.out.println((int) totalFen);
        scanner.close(); // 关闭Scanner对象
    }
}

Python

def exChange(unit):
    # 根据货币单位返回其转换为人民币分的汇率
    if unit == "CNY":
        return 100.0  # 人民币
    elif unit == "JPY":
        return 100.0 / 1825 * 100  # 日元
    elif unit == "HKD":
        return 100.0 / 123 * 100  # 港元
    elif unit == "EUR":
        return 100.0 / 14 * 100  # 欧元
    elif unit == "GBP":
        return 100.0 / 12 * 100  # 英镑
    elif unit == "fen":
        return 1.0  # 人民币分
    elif unit == "cents":
        return 100.0 / 123  # 港元分
    elif unit == "sen":
        return 100.0 / 1825  # 日元分
    elif unit == "eurocents":
        return 100.0 / 14  # 欧元分
    elif unit == "pence":
        return 100.0 / 12  # 英镑分
    else:
        return 0.0  # 无效单位返回0


def main():
    n = int(input())  # 读取记录数
    totalFen = 0.0  # 汇总结果

    # 处理每一条货币记录
    for _ in range(n):
        record = input()  # 读取每一行的记录
        amount = 0  # 用于保存金额
        unit = ""  # 保存单位

        # 遍历当前行,逐个提取金额和单位
        for j, c in enumerate(record):
            if c.isdigit():
                amount = amount * 10 + int(c)  # 构建数字
            else:
                unit += c  # 构建货币单位

            # 当遇到完整的金额+单位时进行换算
            if j == len(record) - 1 or (j + 1 < len(record) and record[j + 1].isdigit() and unit):
                totalFen += amount * exChange(unit)  # 计算并累加到总数
                amount = 0  # 重置金额
                unit = ""  # 清空单位

    # 输出汇总结果,只保留整数部分
    print(int(totalFen))


if __name__ == "__main__":
    main()

JavaScript

const readline = require('readline');

// 根据货币单位返回其转换为人民币分的汇率
function exChange(unit) {
    switch (unit) {
        case 'CNY':
            return 100.0; // 人民币
        case 'JPY':
            return 100.0 / 1825 * 100; // 日元
        case 'HKD':
            return 100.0 / 123 * 100; // 港元
        case 'EUR':
            return 100.0 / 14 * 100; // 欧元
        case 'GBP':
            return 100.0 / 12 * 100; // 英镑
        case 'fen':
            return 1.0; // 人民币分
        case 'cents':
            return 100.0 / 123; // 港元分
        case 'sen':
            return 100.0 / 1825; // 日元分
        case 'eurocents':
            return 100.0 / 14; // 欧元分
        case 'pence':
            return 100.0 / 12; // 英镑分
        default:
            return 0.0; // 无效单位返回0
    }
}

 
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

 
let input = [];
rl.on('line', (line) => {
    input.push(line);
}).on('close', () => {
    const n = parseInt(input[0]); // 读取记录数
    let totalFen = 0; // 汇总结果

    // 处理每一条货币记录
    for (let i = 1; i <= n; i++) {
        const record = input[i];
        let amount = 0; // 用于保存金额
        let unit = ''; // 保存单位

        // 遍历当前行,逐个提取金额和单位
        for (let j = 0; j < record.length; j++) {
            const c = record[j];
            if (/\d/.test(c)) {
                amount = amount * 10 + parseInt(c); // 构建数字
            } else {
                unit += c; // 构建货币单位
            }

            // 当遇到完整的金额+单位时进行换算
            if (j === record.length - 1 || (/\d/.test(record[j + 1]) && unit.length > 0)) {
                totalFen += amount * exChange(unit); // 计算并累加到总数
                amount = 0; // 重置金额
                unit = ''; // 清空单位
            }
        }
    }

    // 输出汇总结果,只保留整数部分
    console.log(Math.floor(totalFen));
});

C++

#include <iostream>
#include <string>
#include <cctype> // 用于 isdigit 函数
#include <sstream> // 用于 stringstream

using namespace std;

// 根据货币单位返回其转换为人民币分的汇率
double exChange(const string &unit) {
    if (unit == "CNY") {
        return 100.0; // 人民币
    } else if (unit == "JPY") {
        return 100.0 / 1825 * 100; // 日元
    } else if (unit == "HKD") {
        return 100.0 / 123 * 100; // 港元
    } else if (unit == "EUR") {
        return 100.0 / 14 * 100; // 欧元
    } else if (unit == "GBP") {
        return 100.0 / 12 * 100; // 英镑
    } else if (unit == "fen") {
        return 1.0; // 人民币分
    } else if (unit == "cents") {
        return 100.0 / 123; // 港元分
    } else if (unit == "sen") {
        return 100.0 / 1825; // 日元分
    } else if (unit == "eurocents") {
        return 100.0 / 14; // 欧元分
    } else if (unit == "pence") {
        return 100.0 / 12; // 英镑分
    } else {
        return 0.0; // 无效单位返回0
    }
}

int main() {
    int n;
    cin >> n; // 读取记录数
    cin.ignore(); // 忽略换行符

    double totalFen = 0; // 汇总结果

    // 处理每一条货币记录
    for (int i = 0; i < n; i++) {
        string record;
        getline(cin, record); // 读取每一行的记录
        int amount = 0; // 用于保存金额
        string unit; // 保存单位

        // 遍历当前行,逐个提取金额和单位
        for (size_t j = 0; j < record.length(); j++) {
            char c = record[j];
            if (isdigit(c)) {
                amount = amount * 10 + (c - '0'); // 构建数字
            } else {
                unit += c; // 构建货币单位
            }

            // 当遇到完整的金额+单位时进行换算
            if (j == record.length() - 1 || (isdigit(record[j + 1]) && !unit.empty())) {
                totalFen += amount * exChange(unit); // 计算并累加到总数
                amount = 0; // 重置金额
                unit.clear(); // 清空单位
            }
        }
    }

    // 输出汇总结果,只保留整数部分
    cout << static_cast<int>(totalFen) << endl;

    return 0;
}

C语言

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 汇率转换函数,返回转换为人民币分的汇率
double exChange(const char* unit) {
    if (strcmp(unit, "CNY") == 0)
        return 100.0; // 人民币元
    else if (strcmp(unit, "JPY") == 0)
        return 100.0 / 1825 * 100; // 日元
    else if (strcmp(unit, "HKD") == 0)
        return 100.0 / 123 * 100; // 港元
    else if (strcmp(unit, "EUR") == 0)
        return 100.0 / 14 * 100; // 欧元
    else if (strcmp(unit, "GBP") == 0)
        return 100.0 / 12 * 100; // 英镑
    else if (strcmp(unit, "fen") == 0)
        return 1.0; // 人民币分
    else if (strcmp(unit, "cents") == 0)
        return 100.0 / 123; // 港元分
    else if (strcmp(unit, "sen") == 0)
        return 100.0 / 1825; // 日元分
    else if (strcmp(unit, "eurocents") == 0)
        return 100.0 / 14; // 欧元分
    else if (strcmp(unit, "pence") == 0)
        return 100.0 / 12; // 英镑分
    else
        return 0.0; // 无效单位
}

int main() {
    int n;  // 记录数
    scanf("%d", &n);  // 读取记录数
    getchar();  // 读取换行符,避免影响后续输入

    double totalFen = 0;  // 汇总结果(人民币分)

    // 处理每一条货币记录
    for (int i = 0; i < n; i++) {
        char record[100];  // 保存输入的记录
        fgets(record, 100, stdin);  // 读取整行记录

        int amount = 0;  // 保存金额
        char unit[20] = "";  // 保存货币单位
        int len = strlen(record);

        // 解析每一条记录
        for (int j = 0; j < len; j++) {
            char c = record[j];
            if (isdigit(c)) {
                amount = amount * 10 + (c - '0');  // 构建数字
            } else if (isalpha(c)) {
                int k = 0;
                while (j < len && isalpha(record[j])) {
                    unit[k++] = record[j++];  // 构建单位
                }
                unit[k] = '\0';  // 添加字符串终止符
                totalFen += amount * exChange(unit);  // 计算并累加
                amount = 0;  // 重置金额
                unit[0] = '\0';  // 清空单位
                j--;  // 回到当前字符(避免跳过字符)
            }
        }

        
    }

    // 输出汇总结果,只保留整数部分
    printf("%d\n", (int)totalFen);

    return 0;
}

完整用例

用例1

1
100CNY

用例2

1
3000fen

用例3

1
123HKD

用例4

2
20CNY53fen
53HKD87cents

用例5

2
100CNY
100JPY

用例6

3
50EUR
25GBP
1000fen

用例7

4
5000sen
1000cents
200eurocents
300pence

用例8

3
100HKD
200JPY
50EUR

用例9

2
1000pence
5000eurocents

用例10

4
10CNY
20JPY
30HKD
40EUR

标签:return,Python,OD,else,record,Java,100.0,100,unit
From: https://blog.csdn.net/long_xiao_yu/article/details/143463584

相关文章

  • Foods
    @目录一、征稿简介二、重要信息三、服务简述四、投稿须知一、征稿简介二、重要信息期刊官网:https://ais.cn/u/3eEJNv三、服务简述生物活性化合物是食物中天然存在的物质,除了基本营养外,还能提供额外的健康益处。这些化合物具有特定的功能特性,对人类健康有直接影响。了解生......
  • 使用wxpython开发跨平台桌面应用,常用窗体布局BoxSizer,FlexGridSizer,GridBagSizer的介
    我们在开发桌面应用的时候,不管是之前C#开发Winform的时候,还是现在使用wxpython来开发跨平台应用的时候,都需要了解布局的处理,wxpython的常用布局Sizer类,包括BoxSizer,FlexGridSizer,GridBagSizer都是我们需要经常打交道的,因此有必要对它们进行一些了解,这样开发界面起来才能得心应手......
  • 制作一个ai丛雨(附Python代码)
    绫,再一次,再一次创造一个有你的世界......
  • Java 多线程售票示例
     1、售票任务类:packagecom.joyupx.cms.example.globalLock5;importcn.hutool.core.date.DateTime;importlombok.extern.slf4j.Slf4j;importstaticjava.lang.Thread.sleep;/***售票任务*@authorhapday*@since0.0.1*/@Slf4jpublicclassSellTicketT......
  • 基于 JAVASSM 框架沙县小吃点餐系统
    基于JAVASSM框架(即Java+Spring+SpringMVC+MyBatis)开发一个沙县小吃点餐系统。步骤一:需求分析明确系统需要实现的功能,比如:用户注册和登录浏览菜单添加菜品到购物车下单并支付订单管理后台管理(菜品管理、订单管理等)步骤二:设计数据库使用MySQL数据库存储系统......
  • 【java开发】FileWriter
    原创大常运维FileWriter(文件字符输出流):作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。构造函数和方法:代码:packagecn.chang.d1_char_stream;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.io.Writer;......
  • 三周精通FastAPI:19 Body - Updates 请求体 - 更新数据
    官网文档:https://fastapi.tiangolo.com/zh/tutorial/body-updates/请求体-更新数据¶用 PUT 更新数据¶更新数据请用 HTTP PUT 操作。把输入数据转换为以JSON格式存储的数据(比如,使用NoSQL数据库时),可以使用 jsonable_encoder。例如,把 datetime 转换为 str。......
  • 一文彻底熟练掌握并使用Java的NIO操作
    一、基本概念JavaNIO是Java1.4引入的,用于处理高速、高并发的I/O操作。与传统的阻塞I/O不同,NIO支持非阻塞I/O和选择器,可以更高效地管理多个通道。二、核心组件通道(Channel)Channel是NIO中用于读取和写入数据的主要接口,提供双向数据传输的能力。常见的通道......
  • Educational Codeforces Round 171 (Rated for Div. 2) 题解
    A.PerpendicularSegments显然构造一个\(k\timesk\)的左下角是原点的正方形即可。voidslv(){ intx,y,k;Read(x,y,k); intmn=min(x,y); if(mn*mn*2>=k*k) Write(0,'',0,'',mn,'',mn,'\n'), Write(0,......
  • 工程师和科学家的高等数学及python实例:1三角函数
    1三角函数在学习了本章内容之后,你应该能够说明三角函数比计算任意给定角的正弦、余弦和正切讨论象限及其应用确定特殊角(0°,30°,45°,60°,90°)的三角比使用特殊角的精确正弦值、余弦值和正切值绘制正弦函数、余弦函数和正切函数的图形1.1引言三角学是数学的......