华为机试-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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tzq@2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值