华为OD-货币单位换算-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便士)
汇率

输入描述:

第一行输入为N,N表示记录数。0<N<100
之后N行,每行表示一条货币记录,且该行只会是一种货币。

输出描述:

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

示例1

输入

1
100CNY

输出

10000

示例2

输入

1
100CNY100fen

输出

10100

编码思路

本题主要考查的知识点为正则表达式+字典。
首先用正则表达式从输入的字符串中提取数据+单位(100+GBP),然后利用字典来调取相应货币的汇率,即可计算出结果。

正则表达式

简单来说,正则表达式可以匹配文中全部符合指定格式的字串。这样说有些抽象,我们实际写代码理解一下。

初识正则表达
import re # 导入正则表达模块
ss = 'I like apples'
# 找到字符串中所有的e
r = re.findall('e',ss)
print(r)
# 输出结果
['e', 'e']
匹配所有字母
ss = "100CNY"
r = re.findall(r"[A-Z]",ss)
print(r)
# 输出结果
['C', 'N', 'Y']
匹配所有数字
ss = "100CNY"
r = re.findall(r"[0-9]",ss)
print(r)
# 输出结果
['1', '0', '0']

在上面的代码中,r"[0-9]“或r”[A-Z]"为正则表达式的匹配规则,其中[0-9]或[A-Z]使用了范围表示法,意为匹配0-9中任意一个数字,或A-Z任意一个大写字母。r代表raw string, 目前无需深究

匹配大写字母或小写字母

上面仅匹配了单一的字母或数字,但是如果我们既想匹配大写字母又想匹配小写字母怎么办?这个时候可以采取并列的写法,例如r"[A-Za-z]"

ss = 100CNY100fen
r = re.findall(r"[A-Za-z]",ss)
print(r)
# 输出结果
['C', 'N', 'Y', 'f', 'e', 'n']
使用量词匹配

在上面的代码块中,我们可以看到[‘C’, ‘N’, ‘Y’, ‘f’, ‘e’, ‘n’]是连在一起的,这使得我们无法区分CNY,和fen。在时,我们可以使用量词+来进行匹配,+代表至少出现一次。

ss = '100CNY100fen'
r1 = re.findall(r"[A-Za-z]+",ss)
print(r1)
r2 = re.findall(r"[0-9]+",ss)
print(r2)
# 输出结果
['CNY', 'fen']
['100', '100']
字符组简记法

上面的[0-9]可以写为\d,意为匹配数字,而[A-Za-z]可以写为\D,意为匹配一个非数字字符。

ss = '100CNY100fen'
r1 = re.findall(r"\D+",ss)
print(r1)
r2 = re.findall(r"\d+",ss)
print(r2)

最后得到了一样的结果

['CNY', 'fen']
['100', '100']

完整代码

exrateInfo = {'CNY':100,'JPY':1825,'HKD':123,'EUR':14,'GBP':12,
          'fen':100,'sen':1825,'cents':123,'eurocents':14,'pence':12}

def curtofen(num,unit):                      # 将货币都换算成fen的函数
    global exrateInfo
    exrate = exrateInfo[unit]
    if unit.isupper():
        a = num* 100 * 100 / exrate
    elif unit.islower():
        a = num * 100 / exrate
    return a

import re
n = int(input())
balance = 0
for i in range(n):
    # 输入数据,并用正则表达式提取数据
    ss = input()
    num = re.findall(r"\d+",ss) # 数字
    unit = re.findall(r"\D+",ss) # 单位
    # 将所有的数据换算成分
    for i in range(len(num)):
        a = curtofen(int(num[i]),unit[i])
        balance += a

print(int(balance))

最后,给大家推荐一本书,叫《正则指引》,这本书对于学习正则表达式很有帮助。
链接:https://pan.quark.cn/s/02fe3e209bc9
提取码:PQqD

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值