5-23 币值转换 (20分)
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB
Read Me 用前必读
给出的代码是为了方便大家阅读和测试而设计的,提交PTA平台时请将第75行打印语句注释掉!
下面给的代码是我读大一的时候写的,现在看看,一坨狗屎……真不知道当时谁给的勇气……
我刷算法时,偶遇此题,想起来了写这篇博客的那个晚上,于是把代码进行了优化,请同学们
代码思路与解读:
代码的执行过程如下:接收用户数据并生成数组,从最高位起每4位分为一组分别创建数组1、2、3并赋值。再依次调用read()函数并各产生一串字符串,判断第二级数组是否需“读‘万’”后再将字符串依次连接,修正完成后即可得到。
点睛0:在小学四年级中“读数”中会将一串数字每四位划为一级,从低到高分别为“个位级”、“万位级”、“亿位级”,每一级的读数规则与“个位级”一致,只需在其后加上“级数”。如:112004300 读作“一亿一千二百万四千三百”。
本算法在一定程度上降低了程序的耦合性,可移植性较其他同学的算法相对高一些,同时由于时间紧迫,部分细节可能做的还不是特别合适,希望各位同学能指出错误与不足。Thanks~
代码1:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int yuanshi = sc.nextInt();
char[] cha = (yuanshi+"").toCharArray();
int[] num = new int[9];// 存放输入的数字
int count = 8;
for (int i = cha.length - 1; i > -1; i--) { // 把输入的数字装进num数组
num[count] = cha[i] - '0';
count--;
}
String sanji = "";
String erji = "";
String yiji = "";
// 第一级处理
int[] s1 = new int[4];
int s1count = 5;
for (int i = 0; i < s1.length; i++) {
s1[i] = num[s1count];
s1count++;
}
String temps1 = read(s1);
if (!temps1.equals("0")) {
yiji = temps1;
}
// 第二级处理
int[] s2 = new int[4];
int s2count = 1;
for (int i = 0; i < s2.length; i++) {
s2[i] = num[s2count];
s2count++;
}
String temps2 = read(s2);
if (!temps2.equals("零")) {
erji = temps2 + "万";
// if(yuanshi > 99999 && num[4] == 0 && num [5] != 0) { //为了解决 “第一级满但是还需要读零”的情况,如:2205678
// erji = temps2 + "万零";
// }else {
// erji = temps2 + "万";
// }
}
// 三级处理
if (num[0] != 0) {
sanji = num[0] + "亿";
}
String reslut = sanji + erji + yiji;
//修正操作
if (reslut.charAt(0) == '零') { // 为了解决read读零的局部性而生成的代码
reslut = reslut.substring(1, reslut.length());
}
if(reslut.equals("")) {
reslut = "零";
}else {
if (reslut.charAt(reslut.length() - 1) == '零') {//去除后零
reslut = reslut.substring(0, reslut.length() - 1);
}
}
System.out.println(reslut);
//下面是为了PTA判题程序而做的一些转换
String reslut2 = reslut.replaceAll("零", "a").replaceAll("1", "b").replaceAll("2", "c")
.replaceAll("3", "d").replaceAll("4", "e").replaceAll("5", "f").replaceAll("6", "g")
.replaceAll("7", "h").replaceAll("8", "i").replaceAll("9", "j").replaceAll("十", "S")
.replaceAll("百", "B").replaceAll("千", "Q").replaceAll("万", "W").replaceAll("亿", "Y");
System.out.println(reslut2);
// 下面是局部测试代码块
// int[] arr = { 0, 1, 0, 3 };
// String str = read(arr);
// System.out.println(str);
// if (str.charAt(0) == '零') { //为了解决read读零的局部性而生成的代码
// System.out.println(str.substring(1, str.length()));
//
// } else {
// System.out.println(str);
// }
}
public static String read(int[] arr) {
String qian = "";
String bai = "";
String shi = "";
String ge = "";
// if(arr[0] != 0 && arr[1] == 0 && arr[2] == 0 && arr[3] == 0) {
// //整十
// return qian+"千";
// }else if(arr[0] = 0 && arr[1] == 0 && arr[2] == 0 && arr[3] == 0){
//
// }
boolean flag = true;// 读零
if (arr[0] != 0) {
if(arr[1] == 0 && arr[2] != 0) {
qian = arr[0] + "千零";
}else if(arr[1] == 0 && arr[3] != 0){
qian = arr[0] + "千零";
}else {
qian = arr[0] + "千";
}
} else {
qian = "零";// 在局部看这行代码是错的,但是为了整体读零这是必须的。需要调用者执行修正操作。
}
if (arr[1] != 0) {
if(arr[2] == 0 && arr[3] != 0) {
bai = arr[1] + "百零";
}else {
bai = arr[1] + "百";
}
} else if (flag && arr[2] != 0) {
bai = "";// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
flag = false;
}
if (arr[2] != 0) {
if (arr[0] == 0 && arr[1] == 0 && arr[2] == 1) {
shi = "十";
} else {
shi = arr[2] + "十";
}
} else if (flag && arr[3] != 0 && arr[1] == 0 ) {
shi = "";//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
flag = false;
}
if (arr[3] != 0) {
ge = arr[3] + "";
}
String reslut = qian + bai + shi + ge;
if (reslut.equals("")) { // 为了防止空指针异常
return "0";
} else {
return reslut;
}
}
}