✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
考试题目和要点:
- 中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。
- 中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。
- 阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如6007.14,应写成“人民币陆仟零柒元壹角肆分“。
- 10应写作“拾”,100应写作“壹佰”。例如,1010.00应写作“人民币壹仟零拾元整”,110.00应写作“人民币壹佰拾元整”
- 十万以上的数字接千不用加“零”,例如,30105000.00应写作“人民币叁仟零拾万伍仟元整”
2. 输入描述
输入一个double数。
3. 输出描述
输出人民币格式。
4. Java算法源码
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();
}
5. 测试
6.解题思路
- 输入一个
double
数。 - 使用
split("\\.")
将输入的数分割为整数部分和小数部分,并存储在字符串数组s
中。 - 判断小数部分是否为"00",如果是,则输出整数部分的中文大写金额数字后跟"元整"。
- 判断整数部分是否为"0",如果是,则输出小数部分的中文大写金额数字。
- 如果不满足以上两种情况,输出整数部分的中文大写金额数字后跟"元",再输出小数部分的中文大写金额数字。
- 实现solveXiao函数,接收小数部分的字符串作为参数,返回小数部分的中文大写金额数字。
- 将小数部分的第一个字符转换为整数,表示角。
- 将小数部分的第二个字符转换为整数,表示分。
- 如果角不为0,则添加角的中文大写金额数字和"角"。
- 如果分不为0,则添加分的中文大写金额数字和"分"。
- 返回拼接后的字符串。
- 实现solveZheng函数,接收整数部分的double数作为参数,返回整数部分的中文大写金额数字。
- 使用
StringBuilder
来拼接中文大写金额数字。 - 使用
pow
变量来表示权值的索引,初始值为0。 - 使用循环,当整数部分不为0时进行迭代。
- 在每次迭代中,根据权值索引添加"万"或"亿"到拼接的字符串中。
- 将整数部分模10000得到四位数的临时值
temp
。 - 提取临时值的个位、十位、百位和千位的数字。
- 判断个位是否为0,如果不为0,则添加个位的中文大写金额数字。
- 判断十位是否为0,如果不为0,则添加"拾"和十位的中文大写金额数字(如果十位为1,则不添加十位的中文大写金额数字)。
- 判断百位是否为0,如果不为0,则添加"佰"和百位的中文大写金额数字。
- 判断千位是否为0,如果不为0,则添加"仟"和千位的中文大写金额数字。
- 更新整数部分为整数部分除以10000的结果,用于下一次迭代。
- 更新权值索引,当索引超过2时,重置为1。
- 循环结束后,将拼接的字符串反转,并返回作为结果。
- 使用
- 在主函数中,使用
while
循环读取输入的每个测试用例。 - 根据题目要求,输出人民币格式的中文大写金额数字。