2的大写
题目描述:
银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
在中文大写方式中,0到10以及100、1000、10000被依次表示为: 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万
以下的例子示范了阿拉伯数字到人民币大写的转换规则:
1 壹圆
11 壹拾壹圆
111 壹佰壹拾壹圆
101 壹佰零壹圆
-1000 负壹仟圆
1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆
现在给你一个整数a(|a|<100000000), 请你打印出人民币大写表示.
例如:a=1
则输出:壹圆
注意:请以unicode的形式输出答案。提示:所有的中文字符,在代码中直接使用其Unicode的形式即可满足要求,中文的Unicode编码可以通过如下方式获得:u'壹'。
这题目最头疼的地方是当一串数字中间和末尾都存在0的时候,要去掉重复出现的0和对应的单位。
例如: 6100 0310元
对应的大写为: 陆仟壹佰万零叁佰壹拾圆
这里6100后面的零转换成大写之后都去掉了,0310个位数上的0也去掉了,但是千位上的数字0保留。
针对题目中的最高八位数的转换,我的思路是先考虑简单的,当输入的数字是1,2,3,或者4位数时,就简单罗列出情况即可,其中4位数时情况较为复杂。以4位数为例,主要考虑0的个数0的位置,一共有如下的16种情况:(以字母N表示该位置是除0以外的其他数字)
NNNN
NNN0
NN0N
NN00
N0NN
N0N0
N00N
N000
0NNN
0NN0
0N0N
0N00
00NN
00N0
000N
0000
这里我把这16种情况分别写进了程序里,待会儿我去看看大神是怎么写的,完整程序如下:
# -*- coding: utf-8 -*-
import itertools
a=-4603100;
c={'0':'零','1':'壹','2':'贰','3':'叁','4':'肆','5':'伍','6':'陆','7':'柒','8':'捌','9':'玖'}
L=[];
k=0;
def AUTO_4(L2,L3):
if L2[0]==0:
if L2[1]==0:
if L2[2]==0:
if L2[3]==0:
del L3[0:7];
else:
del L3[1:6];
else:
if L2[3]==0:
del (L3[1:4],L3[3]);
else:
del L3[1:4];
else: #L[1]!=0 讨论四种情况
if L2[2]==0:
if L2[3]==0:
del (L3[0:2],L3[2:5]);
else:
del (L3[0:2],L3[2:4]);
else:
if L2[3]==0:
del (L3[0:2],L3[4]);
else:
del L3[0:2];
else:
if L2[1]==0:
if L2[2]==0:
if L2[3]==0:
del L3[2:7];
else:
del L3[3:6];
else:
if L2[3]==0:
del (L3[3],L3[5]);
else:
del L3[3];
else: #L[1]!=0 讨论四种情况
if L2[2]==0:
if L2[3]==0:
del L3[4:7];
else:
del L3[4:6];
else:
if L2[3]==0:
del L3[6];
return L3
#判断正负
if a<0:
a=-a;
k=1;#标志位
#将一个数转成数字列表
while True:
(n,l)=pmod(a,10);
L.APPend(l);
a=n;
if a==0:
break
L2=L[::-1]; #因为除法的原因,需要倒一下顺序才是原来的是顺序
NL=len(L2); #判断数的长度
L3=[];
for i in L2:
L3.append(c[str(i)]) #查询字典之后形成一个列表
#在前四位数加上单位
def PP1(NL,L2,L3):
if NL==1:
L3.insert(1,'圆')
if NL==2:
L3.insert(1,'拾')
if L3[2]=='零':
del L3[2]
L3.insert(3,'圆')
if NL==3:
L3.insert(1,'佰')
if L3[2]!='零':
L3.insert(3,'拾')
if L3[4]=='零':
del L3[4]
else:
if L3[3]=='零':
del L3[2]
del L3[2]
L3.insert(5,'圆')
if NL==4:
L3.insert(1,'仟')
L3.insert(3,'佰')
L3.insert(5,'拾')
L3.insert(7,'圆')
AUTO_4(L2,L3);
return L3
#后四位数上加上单位
def PP2(NL,L2,L3):
if NL==1:
L3.insert(1,'万')
if NL==2:
L3.insert(1,'拾')
if L3[2]=='零':
del L3[2]
L3.insert(3,'万')
if NL==3:
L3.insert(1,'佰')
if L3[2]!='零':
L3.insert(3,'拾')
if L3[4]=='零':
del L3[4]
else:
if L3[3]=='零':
del L3[2]
del L3[2]
L3.insert(5,'万')
if NL==4:
L3.insert(1,'仟')
L3.insert(3,'佰')
L3.insert(5,'拾')
L3.insert(7,'万')
AUTO_4(L2,L3);
return L3
if NL<5:
Q1=PP1(NL,L2,L3);
else:
M2=L2[-4::];
LL2=L3[-4::]; #取出后四位数
del(L3[-4::])
del(L2[-4::])
LL1=L3; #取出前面的几位数
M1=L2;
NL1=len(LL1);
Q2=PP1(4,M2,LL2);
Q1=PP2(NL1,M1,LL1);
Q1.extend(Q2);
#根据正负加上符号
if k==1:
Q1.insert(0,'负')
#把列表字符合并
s = "".join(itertools.chain(*Q1))
print(s)
对比一下大神们的操作,自己的代码简直弱爆了,请睁大双眼
num_dic = {'0':u'零', '1':u'壹', '2':u'贰', '3':u'叁', '4':u'肆', '5':u'伍', '6':u'陆', '7':u'柒', '8':u'捌', '9':u'玖'}
unit_dic = {0:u'仟', 1:'佰', 2:'拾', 3:'万', 4:'仟', 5:'佰', 6:'拾', 7:''}
temp = []
t = str('%8d'%abs(a)) #重点:把数字换成固定长度8位的字符串
for s in range(0,4):
if t[s] != ' ' and t[s] != '0':
temp.append(num_dic[t[s]])
temp.append(unit_dic[s])
if t[s] == '0' and s <3 and t[s+1] != '0':
temp.append(num_dic[t[s]])
if(t[2] != ' ' and t[3] == '0'):
temp.append('万')
print(t)
for s in range(4,8):
if t[s] != ' ' and t[s] != '0':
temp.append(num_dic[t[s]])
temp.append(unit_dic[s])
if t[s] == '0' and s <7 and t[s+1] != '0':
temp.append(num_dic[t[s]])
temp = ''.join(temp)
if a < 0:
temp = '负' + temp
if a == 0:
temp = '零' + temp
print(temp + u'圆')
如上,我觉得自己的思路还是不够宏观,不够清楚,自己想到的是细节的东西,然后有用代码去解决,上面大神的思路要更加大局一点,很清晰,我是通过分类讨论的思路,而大神是通过检测增添的思路。
下面这个10行代码更是十分暴力,只能说其中enumerate()和zip()函数学到了,膜拜膜拜。
digit = [u'零',u'壹',u'贰',u'叁',u'肆',u'伍',u'陆',u'柒',u'捌',u'玖']
weight = [u'圆',u'拾',u'佰',u'仟',u'万',u'拾',u'佰',u'仟']
Z = [(u'零仟',u'零佰',u'零拾',u'零零零',u'零零',u'零万',u'零圆'),(u'零',u'零',u'零',u'零',u'零',u'万',u'圆')]
num = str(abs(a)) # 整数转换成字符串
s = u'负' if a<0 else ''
for i,x in enumerate(num):
s += digit[int(x)] + weight[len(num)-i-1]
for z,v in zip(Z[0],Z[1]):
s = s.replace(z,v)
print u'零圆' if a==0 else s
相关阅读
PDF转JPG如何转换? 在日常生活和工作时,我们一般都会学习一些文件之间转换的技巧来提高办公效率。尤其是当我们遇到批量转换时,一个
Python3中列表del(),remove(),pop()三个函数
del():删除指定值 del a[0] remove():移除指定值 a.remove("str") pop()获取并删除指定位置元素 A = ['a','b','c'] # pop
Excel2010的简繁转换操作和EXCEL2007差不多,但貌似excel2010要比2007稳定多了,几乎未见2010丢失简繁转换功能的。今天,seo实验室小
最近在学习SLAM,主要的学习资料为高翔的《视觉SLAM十四讲》,首先安利一下这本书,这本书由浅入的介绍了SLAM的整体结构,算法介绍与实际
'Thu May 12 2016 08:00:00 GMT+0800 (中国标准时间)'--此格式日期无法传到java后台,须格式化,方法如下 var d = new Date('Thu M