华为机试-095-较难-HJ95.人民币转换
一、描述
考试题目和要点:
1、中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。
2、中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。
3、阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如6007.14,应写成“人民币陆仟零柒元壹角肆分“。
4、10应写作“拾”,100应写作“壹佰”。例如,1010.00应写作“人民币壹仟零拾元整”,110.00应写作“人民币壹佰拾元整”
5、十万以上的数字接千不用加“零”,例如,30105000.00应写作“人民币叁仟零拾万伍仟元整”
1.1、输入描述
- 输入一个double数
1.2、输出描述
- 输出人民币格式
二、示例
2.1、示例1
输入:
151121.15
输出:
人民币拾伍万壹仟壹佰贰拾壹元壹角伍分
2.2、示例2
输入:
1010.00
输出:
人民币壹仟零拾元整
三、答案(java)
3.1、方法一
package com.tzq.hwod;
import java.util.Scanner;
//注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static String[] ten = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
public static String[] power = { "万", "亿" };
public static String[] daiwei = { "元", "角", "分", "整" };
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String[] s = in.nextLine().split("\\.");// 分割为整数部分和小数部分
if (s[1].equals("00")) {
System.out.println("人民币" + solveZheng(Double.parseDouble(s[0])) + "元整");
} else if (s[0].equals("0")) {
System.out.println("人民币" + solveXiao(s[1]));
} else {
System.out.println("人民币" + solveZheng(Double.parseDouble(s[0])) + "元" + solveXiao(s[1]));
}
}
}
public static String solveXiao(String s2) {
StringBuilder sb = new StringBuilder();
int jiao = Integer.parseInt(s2.substring(0, 1));
int fen = Integer.parseInt(s2.substring(1, 2));
if (jiao != 0) {
sb.append(ten[jiao]);
sb.append("角");
}
if (fen != 0) {
sb.append(ten[fen]);
sb.append("分");
}
return sb.toString();
}
public static String solveZheng(double zheng) {
StringBuilder sb = new StringBuilder();
int pow = 0;
while ((int) zheng != 0) {
if (pow != 0) {
sb.append(power[pow - 1]);
}
int temp = (int) (zheng % 10000);
// 个位
int gewei = temp % 10;
int shiwei = (temp / 10) % 10;
int baiwei = (temp / 100) % 10;
int qianwei = (temp / 1000) % 10;
if (gewei != 0) {
sb.append(ten[gewei]);
}
// 十位
if (shiwei != 0) {
sb.append("拾");
if (shiwei != 1) {
sb.append(ten[shiwei]);
}
} else {
if (gewei != 0 && (temp > 99 || (int) zheng > 10000)) {
sb.append(ten[0]);
}
}
// 百位
if (baiwei != 0) {
sb.append("佰");
sb.append(ten[baiwei]);
} else {
if (shiwei != 0 && (temp > 999 || (int) zheng > 10000)) {
sb.append(ten[0]);
}
}
if (qianwei != 0) {
sb.append("仟");
sb.append(ten[qianwei]);
} else {
if (baiwei != 0 && (int) zheng > 10000) {
sb.append(ten[0]);//
}
}
zheng /= 10000;
pow++;
if (pow > 2) {
pow = 1;
}
}
return sb.reverse().toString();
}
}
四、答案(python 3)
4.1、方法一
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def fun(n, s =''):
if n < 20: # 由于10应写作“拾”,所以第一前1-19进行查字典处理
s += dic[n]
elif n < 100 : # 大于20小于100的数
if n % 10 >= 1: # 非整十
s += fun(n//10) + '拾' + fun(n % 10)
else: # 整十
s += fun(n//10) + '拾'
elif n < 1000: # 大于100小于1000的数
if n % 100 >= 10: # 十位不为0
s += fun(n//100) + '佰' + fun(n % 100)
elif n % 100 > 0: # 个位不为零
s += fun(n//100) + '佰零' + fun(n % 100)
else: # 个位为零
s += fun(n//100) + '佰'
elif n < 10000: # 大于1000小于10000的数
if n % 1000 >= 100: # 百位不为零
s += fun(n//1000) + '仟' + fun(n % 1000)
elif n % 1000 > 0: # 个位不为0
s += fun(n//1000) + '仟零' + fun(n % 1000)
else: # 个位为0
s += fun(n//1000) + '仟'
elif n < 100000000: # 大于10000小于100000000的数
if n % 10000 >= 1000: # 千位不为0时
s += fun(n//10000) + '万' + fun(n % 10000)
elif n % 10000 > 0: # 个位不为0
s += fun(n//10000) + '万零' + fun(n % 10000)
else: # 个位为0
s += fun(n//10000) + '万'
else: # 大于100000000的数
if n % 100000000 >= 10000000: # 千万位不为0
s += fun(n//10000) + '亿' + fun(n % 100000000)
elif n % 100000000 > 0: # 个位不为0
s += fun(n//100000000) + '亿零' + fun(n % 100000000)
else: # 个位为0
s += fun(n//100000000) + '亿'
return s
while True:
try:
dic = {1:'壹', 2:'贰', 3:'叁', 4:'肆', 5:'伍', 6:'陆', 7:'柒', 8:'捌', 9:'玖', 10:'拾', 11:'拾壹', 12:'拾贰', 13:'拾叁', 14:'拾肆', 15:'拾伍', 16:'拾陆', 17:'拾柒', 18:'拾捌', 19:'拾玖'}
n, f = map(int,input().split('.'))
if n > 0:
s = '人民币' + fun(n) + '元'
else:
s = '人民币'
if f == 0:
s += '整'
elif f < 10:
s += dic[f] + '分'
elif f % 10 == 0:
s += dic[f//10] + '角'
else:
s += dic[f//10] + '角' + dic[f % 10] + '分'
print(s)
except:
break