lsdsg 发表于 2021-6-20 19:18:05

人民币大写,太难

【问题描述】

    在发票上通常要加印大写汉字金额,编写一个程序,对键盘上输入一个13位内的整数,将其转换为大写汉字的人民币金额。

【输入形式】

    输入一个整数
【输出形式】

    输出大写的人民币金额
【样例输入】

123456789

【样例输出】

壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元整

【样例说明】

为解决系统中文不能输出问题,请在源程序前面加上下面语句:

import io

import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')

sys.stdin = io.TextIOWrapper(sys.stdin.buffer,encoding='utf-8')

nahongyan1997 发表于 2021-6-23 15:04:01

本帖最后由 nahongyan1997 于 2021-6-23 15:05 编辑

一年前我研究过,太容易出bug,就放弃了。。

比如一亿亿万二千

lsdsg 发表于 2021-6-24 16:13:16

nahongyan1997 发表于 2021-6-23 15:04
一年前我研究过,太容易出bug,就放弃了。。

比如一亿亿万二千

等我找助教要答案{:5_108:}

nahongyan1997 发表于 2021-6-24 16:34:42

lsdsg 发表于 2021-6-24 16:13
等我找助教要答案

哇,你要分享给我吗{:10_257:}

阿奇_o 发表于 2021-6-25 02:13:18

本帖最后由 阿奇_o 于 2021-6-25 14:11 编辑

题目里 “一个13位内的整数”, 我的认为是: 最大12位,即 9999 9999 9999 最大。
好,看代码:

# 思路:分别对 亿以上,万以上,万以下的,做类似的处理。小心注意处理中间各种零的情况

# 代码实现:
s = input()
assert int(s) > 0
# 分别取出 亿以上,万以上,万以下的
sy, sw, sq = '', '', ''
if len(s) > 8:                  # 一亿以上的(9到12位位数)
    sy = s[:len(s)-8]
    sw = s
    sq = s[-4:]
elif len(s) <= 8 and len(s) > 4:# 小于一亿,但大于等于一万的 (五位到八位数)
    sw, sq = s[:-4], s[-4:]
else:
    sq = s                     # 小于一万的

# 或者 简单的
s = '0'*(12-len(s)) + s
sy, sw, sq = s[:4], s, s
# print(sy, sw, sq)

# 处理仟佰拾,以及中间有零的情况
n, zh = '0123456789', "零壹贰叁肆伍陆柒捌玖"
def qbs(sx=''):
    if sx == '' or sx == '0000':      # 处理像1234-0000-1234里的0000 (没“万”)
      return ''
    elif sx == '0' or sx[:2] == '00' or sx[:3] == '000':             # 处理像 0111, 0011, 0001
      return ("零"+str(int(sx))).translate(''.maketrans(n, zh))
    else:
      x = "仟佰拾" if len(sx) == 4 else "佰拾" if len(sx) == 3 else "拾" if len(sx) == 2 else ""
      t = ''.join(, x)]) + sx[-1]
      t = t.replace("0佰0拾0", "").replace("0拾0", "").replace("0", "")# 处理像 1000, 1100, 1110
      return t.translate(''.maketrans(n, zh))

print(
    qbs(sx=sy), "亿" if qbs(sy) != '' else "",
    qbs(sw), "万" if qbs(sw) != '' else "",
    qbs(sq), "元整" if qbs(sq) != '' else '',
    sep='')

nahongyan1997 发表于 2021-6-25 08:50:56

本帖最后由 nahongyan1997 于 2021-6-25 09:09 编辑

阿奇_o 发表于 2021-6-25 02:13
题目里 “一个13位内的整数”, 我的认为是: 最大12位,即 9999 9999 9999 最大。
好,看代码:

大佬,你的代码被我破解了,

120412040124    这个数字没法识别

z5560636 发表于 2021-6-25 11:36:07


def 转换(变量):
    大写字典 = {1: '壹', 2: '贰', 3: '叁', 4: '肆', 5: '伍', 6: '陆', 7: '柒', 8: '捌', 9: '玖', 0: '零'}
    单位字典1 = {0:'',1:'十',2:'百',3:'千'}
    单位字典2 = {0:'',1:'万',2:'亿',3:'兆'}
    列表 =
    列表颠倒 = 列表[::-1]
    返回字符串="元整"
    for 字符组合数组位置变量 in range(len(列表颠倒)):
      # 添加单位字典1
      返回字符串 = ''.join([大写字典[列表颠倒[字符组合数组位置变量]],单位字典1[(字符组合数组位置变量)%4],返回字符串])

      # 添加单位字典2,添加单位
      if not (字符组合数组位置变量 + 1) % 4 and (字符组合数组位置变量 + 1) < len(列表颠倒):
            返回字符串 = ''.join([单位字典2[(字符组合数组位置变量 + 1) // 4], 返回字符串])
    return 返回字符串

print(转换(123456789))

应该还有小BUG,但是不重要,思路就是这样的。

sunrise085 发表于 2021-6-27 13:47:40

本帖最后由 sunrise085 于 2021-6-27 13:53 编辑

这个问题我之前写过,当时要比你这个更加复杂。
难点在于中间0的处理。我把之前的程序简单地删减了一下,或许还可以更加精简。
你看看。
numch = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
rmbqian = ["","拾","佰","仟"]
rmbpian = ["","萬","亿"]
#10000以内整数进行转换
def qian_exc(str1):
    num=int(str1)
    result=''
    k=0
    while num:
      a=num%10
      num=num//10
      if a!=0:
            result=rmbqian+result
      result=numch+result
      k+=1
    result=result.strip('零')
    if result.count('零')>1:
      result=result.replace('零','',1)
    if int(str1)<1000:
      result='零'+result
    return result
#将整数部分进行转换
def yuan_exc(str_yuan):
    yuan=[]
    while str_yuan:
      yuan.append(str_yuan[-4:])
      str_yuan=str_yuan[:-4]
    readwords='圆'
    for i in range(len(yuan)):
      piece=qian_exc(yuan)
      if piece!='零':
            readwords = rmbpian + readwords
            readwords = piece + readwords
    if readwords=='零':
      readwords=readwords
    readwords= readwords.replace('零零','零')
    if readwords[-2]=='零':
      readwords=readwords[:-2]+'圆'
    return readwords

yuan_words=''
l=1
str1=input('请输入:')
while l: #保证输入正确
    l=0
    try:
      f=int(str1)
      if f<0:
            str1=input('请输入一个正数:')
            l=1
    except:
      str1=input('有错误字符,请重新输入:')

if str1!='0':            #整数部分不为0,进行转换
    yuan_words=yuan_exc(str1)

if yuan_words=='':               #输入为0时,say_words==''
    yuan_words='零圆'
yuan_words=yuan_words+'整'            #在最后添加“整”
   
print(yuan_words)

nahongyan1997 发表于 2021-6-27 13:50:55

sunrise085 发表于 2021-6-27 13:47
这个问题我之前写过,当时要比你这个更加复杂。
难点在于中间0的处理。我把之前的程序简单地删减了一下, ...

人家在银行工作,你得保证你这个玩意不会出bug啊

sunrise085 发表于 2021-6-27 13:55:03

nahongyan1997 发表于 2021-6-27 13:50
人家在银行工作,你得保证你这个玩意不会出bug啊

小朋友,不要整天的怼天怼地怼空气

空说无凭,你找出bug啊

nahongyan1997 发表于 2021-6-27 14:02:20

sunrise085 发表于 2021-6-27 13:55
小朋友,不要整天的怼天怼地怼空气

空说无凭,你找出bug啊

我测试通过了,大老牛逼

徐露琦 发表于 2021-6-27 14:38:37

求答案

nahongyan1997 发表于 2021-6-27 15:16:20

徐露琦 发表于 2021-6-27 14:38
求答案

10 楼的答案没有问题

lsdsg 发表于 2021-6-30 17:12:24

sunrise085 发表于 2021-6-27 13:55
小朋友,不要整天的怼天怼地怼空气

空说无凭,你找出bug啊

{:5_108:}
页: [1]
查看完整版本: 人民币大写,太难