1. 程式人生 > >python 作業2:人民幣大寫轉換問題

python 作業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)=divmod(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

相關推薦

python 作業2人民幣大寫轉換問題

題目描述:銀行在列印票據的時候,常常需要將阿拉伯數字表示的人民幣金額轉換為大寫表示,現在請你來完成這樣一個程式。在中文大寫方式中,0到10以及100、1000、10000被依次表示為: 零 壹 貳 叄 肆 伍 陸 柒 捌 玖 拾 佰 仟 萬以下的例子示範了阿拉伯數字到人

python實現人民幣大寫轉換

#!/usr/bin/python # -*- coding:utf-8 -*- # ********* 轉換方法介紹 ********* # 將需要轉換的數字從右向左,每4位分成一個section,如:24530467103,將該數字拆分後,得到: # 24

網易雲課堂_C++程序設計入門(下)_第8單元年年歲歲花相似– 運算符重載_第8單元 - 作業2OJ編程 - 重載數組下標運算符

ref [] jna turn draw cred 超出範圍 input detail 第8單元 - 作業2:OJ編程 - 重載數組下標運算符 查看幫助 返回 溫馨提示: 1.本次作業屬於Online Judge題目,提交後由系統即時判分。 2.學生可以在

軟工作業2硬幣遊戲——代碼的分析與改進

lis com color detail ogl .com commit mon atp 目的: Python 程序閱讀理解 學習Python 編碼風格指南中譯版(Google SOC), 改進Python程序 如何設計遊戲規則,使得慈善事業可持續。 地鐵口放置硬幣箱

Python作業2,購物車程序

eas 作業 break [] true else 檢測 auth bsp 程序:購物車程序 需求: 啟動程序後,讓用戶輸入工資,然後打印商品列表 允許用戶根據商品編號購買商品 用戶選擇商品後,檢測余額是否夠,夠就直接扣款,不夠就提醒 可隨時退出,退出時,打印已購買商品

個人作業2APP案例分析

似的 第一時間 為我 style href 程序出錯 朋友 bsp oca 鐵路12306案例分析 第一部分 調研, 評測 1.下載軟件並使用起來,描述最簡單直觀的個人第一次上手體驗。 鐵路12306app第一次使用的時候讓人感覺界面簡潔明

個人作業2網站分析之慕課網

配置 一次 adding tar 可能 經理 不同 自己的 同方 產品名   慕課網(網站) 選擇原因     目前使用比較頻繁的網站,也是程序員必備的一個網站 第一部分調研,評測   1、第一次上手體驗。 首頁分類清楚,可以根據課程,職業路徑,還可以使用模糊查詢,根據需

集美大學1414班軟件工程個人作業2——個人作業2APP案例分析

代碼 美工 總計 val 需求分析 get gui 背景 優點 一、作業鏈接 個人作業2:APP案例分析 二、博文要求 通過分析你選中的產品,結合閱讀《構建之法》,寫一篇隨筆,包含下述三個環節的所有要求。 第一部分 調研, 評測 下載軟件並使用起來,描述最簡

課後作業2遞歸編程解決漢諾塔問題

args 漢諾塔問題 char ext n) 兩個 port one input 【程序設計思想】 將A座上盤子移到C座上,實現的操作:1,將A座上除最下面其余盤子移到B座上2,將A座上一個盤子移到C座上3,將B座上盤子移到C座上。

團隊作業2需求分析&原型設計

符號 原型設計工具 日期 clas max 獲得 痛苦 組合 人員 Deadline: 2017-11-5 22:00PM,以博客發表日期為準。 評分基準: 按時交 - 有分,檢查的項目包括後文的三個方面 需求分析 原型設計 編碼規範 晚交

實踐作業2黑盒測試實踐——小組任務分工 Day 5

技術 學生 一個 http es2017 record 系統 logs alt 1、處理了學生信息管理系統運行的小細節 2、總結了katalon的使用流程如下   a.在Katalon Studio中創建一個自動化測試項目.   b.創建一個測試案例,用來寫入所有必要的測試

python作業5多級菜單

多級 主程序 一次循環 rate 循環 數字 print 次循環 輸入 # 作業5:多級菜單# ● 三級菜單,省、市、縣、公司,要求程序啟動後,允許用戶依次選擇進入各子菜單# ● 可以在任意一級菜單返回上級菜單,也可以退出程序# ● 所需新知識點:列表、字典##

第0周作業2博客閱讀和思考

技術 .cn 喜歡 最大 合格 開發文檔 培訓 世界 是我 關於當初 說起來,選擇這個專業的原因和那些因為興趣愛好或是被某一個點所吸引的同學並不相同,我的理由是庸俗的,就是為了錢。高考畢業以後,根據家裏親戚的建議,以及我個人的高中學科偏好的判斷,還有一點對編程所謂

OO博客作業2第5-7周作業總結

不但 如果 程序 RM 發的 hang eva 場景 summary (1)從多線程的協同和同步控制方面,分析和總結自己三次作業來的設計策略及其變化。 第5次作業:多線程電梯 基本照搬了課件上“生產者-消費者”模型的設計策略,將InputHandler設計為生產者線程,將S

python-作業-2

inpu 註意 class clas print 登陸 -- end bre 小結 1.判斷某個東西是否在某個東西裏面,in or not in,返回結果是布爾值(false or true)   name = "電磁輻射"  v = "裏" in name  print

9.13作業2(完整溫度轉換、數字遊戲、解析身份證號...)

網址 ren mage code pan .cn 溫度 img image 1.完成完整的溫度轉換程序 輸入代碼: 1 a = input(‘"攝氏轉華氏請按1\n華氏轉攝氏請按2\n"‘) 2 3 if a == ‘1‘: 4 # 用戶輸入攝氏溫度

軟件作業2時事點評-紅芯瀏覽器事件

瀏覽器 積累 定義 教程 com 功能 壟斷 碼農 聲明 一、紅芯事件 事件描述 自稱“打破美國壟斷,中國首個自主創新智能瀏覽器內核”的紅芯瀏覽器被發現註釋過度,安全性低,且出現大量與谷歌瀏覽器Chrome一樣的文件,與其自稱的創新不符。 二、我的評論 我認為程序中可以

軟工作業 2時事點評-紅芯瀏覽器事件

pan 兩件 http 技術 ima 瀏覽器內核 方便 alt strong 一:紅芯瀏覽器事件 “中國首個自主創新智能瀏覽器內核”的紅芯瀏覽器被爆抄襲,內部代碼引人爭議。 二:我的觀點 我覺得註釋是必不可少的,無論是便於他人接手時的閱讀,還是

軟工作業2時事點評-紅芯瀏覽器事件

語言 過度 代碼冗余 發出 創新 軟工 程序 1.26 nbsp 一、紅芯事件 8月16日,自稱“打破美國壟斷,中國首個自主創新智能瀏覽器內核”的紅芯瀏覽器,被網友發現“只是谷歌瀏覽器換了一層皮”——紅芯瀏覽器安裝包解壓後發現,最終可以得到一個版本號為49.1.2623.2

高軟作業2視頻剪輯軟件調研

狀況 狀態 微博 spa 電腦性能 選擇 borde 我會 定義   近些年來,隨著人們精神需求的增加,隨時隨地都可以拍攝的短視頻不僅能夠記錄人們生活的點滴,更可以向別人展示自我,類似於抖音一類的短視頻受到大家越來越多的青睞。借此機會視頻剪輯器也迎來了新的發展契機,尤其是一