鱼C论坛

 找回密码
 立即注册
查看: 4442|回复: 13

[已解决]人民币大写,太难

[复制链接]
发表于 2021-6-20 19:18:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
【问题描述】

    在发票上通常要加印大写汉字金额,编写一个程序,对键盘上输入一个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')
最佳答案
2021-6-27 13:47:40
本帖最后由 sunrise085 于 2021-6-27 13:53 编辑

这个问题我之前写过,当时要比你这个更加复杂。
难点在于中间0的处理。我把之前的程序简单地删减了一下,或许还可以更加精简。
你看看。
  1. numch = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
  2. rmbqian = ["","拾","佰","仟"]
  3. rmbpian = ["","萬","亿"]
  4. #10000以内整数进行转换
  5. def qian_exc(str1):
  6.     num=int(str1)
  7.     result=''
  8.     k=0
  9.     while num:
  10.         a=num%10
  11.         num=num//10
  12.         if a!=0:
  13.             result=rmbqian[k]+result
  14.         result=numch[a]+result
  15.         k+=1
  16.     result=result.strip('零')
  17.     if result.count('零')>1:
  18.         result=result.replace('零','',1)
  19.     if int(str1)<1000:
  20.         result='零'+result
  21.     return result
  22. #将整数部分进行转换
  23. def yuan_exc(str_yuan):
  24.     yuan=[]
  25.     while str_yuan:
  26.         yuan.append(str_yuan[-4:])
  27.         str_yuan=str_yuan[:-4]
  28.     readwords='圆'
  29.     for i in range(len(yuan)):
  30.         piece=qian_exc(yuan[i])
  31.         if piece!='零':
  32.             readwords = rmbpian[i] + readwords
  33.             readwords = piece + readwords
  34.     if readwords[0]=='零':
  35.         readwords=readwords[1:]
  36.     readwords= readwords.replace('零零','零')
  37.     if readwords[-2]=='零':
  38.         readwords=readwords[:-2]+'圆'
  39.     return readwords

  40. yuan_words=''
  41. l=1
  42. str1=input('请输入:')
  43. while l: #保证输入正确
  44.     l=0
  45.     try:
  46.         f=int(str1)
  47.         if f<0:
  48.             str1=input('请输入一个正数:')
  49.             l=1
  50.     except:
  51.         str1=input('有错误字符,请重新输入:')

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

  54. if yuan_words=='':               #输入为0时,say_words==''
  55.     yuan_words='零圆'
  56. yuan_words=yuan_words+'整'              #在最后添加“整”
  57.    
  58. print(yuan_words)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-23 15:04:01 | 显示全部楼层
本帖最后由 nahongyan1997 于 2021-6-23 15:05 编辑

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

比如一亿亿万二千
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-24 16:13:16 | 显示全部楼层
nahongyan1997 发表于 2021-6-23 15:04
一年前我研究过,太容易出bug,就放弃了。。

比如一亿亿万二千

等我找助教要答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-24 16:34:42 | 显示全部楼层
lsdsg 发表于 2021-6-24 16:13
等我找助教要答案

哇,你要分享给我吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-25 02:13:18 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-6-25 14:11 编辑

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

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

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

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

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

  31. print(
  32.     qbs(sx=sy), "亿" if qbs(sy) != '' else "",
  33.     qbs(sw), "万" if qbs(sw) != '' else "",
  34.     qbs(sq), "元整" if qbs(sq) != '' else '',
  35.     sep='')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-25 08:50:56 | 显示全部楼层
本帖最后由 nahongyan1997 于 2021-6-25 09:09 编辑
阿奇_o 发表于 2021-6-25 02:13
题目里 “一个13位内的整数”, 我的认为是: 最大12位,即 9999 9999 9999 最大。
好,看代码:


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

120412040124    这个数字没法识别
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-25 11:36:07 | 显示全部楼层

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

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

  15. print(转换(123456789))
复制代码


应该还有小BUG,但是不重要,思路就是这样的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 13:47:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2021-6-27 13:53 编辑

这个问题我之前写过,当时要比你这个更加复杂。
难点在于中间0的处理。我把之前的程序简单地删减了一下,或许还可以更加精简。
你看看。
  1. numch = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
  2. rmbqian = ["","拾","佰","仟"]
  3. rmbpian = ["","萬","亿"]
  4. #10000以内整数进行转换
  5. def qian_exc(str1):
  6.     num=int(str1)
  7.     result=''
  8.     k=0
  9.     while num:
  10.         a=num%10
  11.         num=num//10
  12.         if a!=0:
  13.             result=rmbqian[k]+result
  14.         result=numch[a]+result
  15.         k+=1
  16.     result=result.strip('零')
  17.     if result.count('零')>1:
  18.         result=result.replace('零','',1)
  19.     if int(str1)<1000:
  20.         result='零'+result
  21.     return result
  22. #将整数部分进行转换
  23. def yuan_exc(str_yuan):
  24.     yuan=[]
  25.     while str_yuan:
  26.         yuan.append(str_yuan[-4:])
  27.         str_yuan=str_yuan[:-4]
  28.     readwords='圆'
  29.     for i in range(len(yuan)):
  30.         piece=qian_exc(yuan[i])
  31.         if piece!='零':
  32.             readwords = rmbpian[i] + readwords
  33.             readwords = piece + readwords
  34.     if readwords[0]=='零':
  35.         readwords=readwords[1:]
  36.     readwords= readwords.replace('零零','零')
  37.     if readwords[-2]=='零':
  38.         readwords=readwords[:-2]+'圆'
  39.     return readwords

  40. yuan_words=''
  41. l=1
  42. str1=input('请输入:')
  43. while l: #保证输入正确
  44.     l=0
  45.     try:
  46.         f=int(str1)
  47.         if f<0:
  48.             str1=input('请输入一个正数:')
  49.             l=1
  50.     except:
  51.         str1=input('有错误字符,请重新输入:')

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

  54. if yuan_words=='':               #输入为0时,say_words==''
  55.     yuan_words='零圆'
  56. yuan_words=yuan_words+'整'              #在最后添加“整”
  57.    
  58. print(yuan_words)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

人家在银行工作,你得保证你这个玩意不会出bug啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 13:55:03 | 显示全部楼层
nahongyan1997 发表于 2021-6-27 13:50
人家在银行工作,你得保证你这个玩意不会出bug啊

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

空说无凭,你找出bug啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-6-27 14:02:20 | 显示全部楼层
sunrise085 发表于 2021-6-27 13:55
小朋友,不要整天的怼天怼地怼空气

空说无凭,你找出bug啊

我测试通过了,大老牛逼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 14:38:37 | 显示全部楼层
求答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 15:16:20 | 显示全部楼层

10 楼的答案没有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-30 17:12:24 | 显示全部楼层
sunrise085 发表于 2021-6-27 13:55
小朋友,不要整天的怼天怼地怼空气

空说无凭,你找出bug啊

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 03:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表