人民币大写,太难
【问题描述】在发票上通常要加印大写汉字金额,编写一个程序,对键盘上输入一个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:05 编辑
一年前我研究过,太容易出bug,就放弃了。。
比如一亿亿万二千 nahongyan1997 发表于 2021-6-23 15:04
一年前我研究过,太容易出bug,就放弃了。。
比如一亿亿万二千
等我找助教要答案{:5_108:} lsdsg 发表于 2021-6-24 16:13
等我找助教要答案
哇,你要分享给我吗{:10_257:} 本帖最后由 阿奇_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 09:09 编辑
阿奇_o 发表于 2021-6-25 02:13
题目里 “一个13位内的整数”, 我的认为是: 最大12位,即 9999 9999 9999 最大。
好,看代码:
大佬,你的代码被我破解了,
120412040124 这个数字没法识别
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: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) sunrise085 发表于 2021-6-27 13:47
这个问题我之前写过,当时要比你这个更加复杂。
难点在于中间0的处理。我把之前的程序简单地删减了一下, ...
人家在银行工作,你得保证你这个玩意不会出bug啊 nahongyan1997 发表于 2021-6-27 13:50
人家在银行工作,你得保证你这个玩意不会出bug啊
小朋友,不要整天的怼天怼地怼空气
空说无凭,你找出bug啊 sunrise085 发表于 2021-6-27 13:55
小朋友,不要整天的怼天怼地怼空气
空说无凭,你找出bug啊
我测试通过了,大老牛逼 求答案 徐露琦 发表于 2021-6-27 14:38
求答案
10 楼的答案没有问题 sunrise085 发表于 2021-6-27 13:55
小朋友,不要整天的怼天怼地怼空气
空说无凭,你找出bug啊
{:5_108:}
页:
[1]