第二次提交通过,很意外啊。将数字字符串按小数点分开,先处理小数部分,再处理整数部分。每一部分都从低位开始,即小数里面先处理分再处理角,整数里面按个位、十位、百位、千位……的顺序处理。数字的转换有个小技巧,将人民币大写的数字字符按从小到大的顺序存在字符数组中,char[] numbers = {'壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'},转换数字时,可以用数字字符减去‘0’再减1得到它对应的大写,如‘9’-’0'-1=8,numbers[8]='玖'。整数从元开始,每处理4位数字要加一下权重,到万,亿……最后把字符串倒换一下顺序,输出结果
运行时间:14ms超过91.85% 用Java提交的代码
占用内存:9660KB超过87.23%用Java提交的代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
private static char[] numbers = {'壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
private static char[] wights = {'分', '角', '元', '万', '亿'};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
StringBuffer result = new StringBuffer();
String[] s1 = s.split("\\.");
if ("00".equals(s1[1])) {
result.append("整");
} else {
for (int i = s1[1].length() - 1; i >= 0; i--) {
if (s1[1].charAt(i) == '0') {
continue;
} else {
result.append(wights[1 - i]).append(numbers[s1[1].charAt(i) - '0' - 1]);
}
}
}
if ("0".equals(s1[0])) {
result.append("币民人");
result.reverse();
System.out.println(result);
return;
} else {
int wight = 2;
int count4 = 0;
int i = s1[0].length() - 1;
while (i >= 0) {
switch (count4 % 4) {
case 0:
result.append(wights[wight]);
wight++;
break;
case 1:
result.append("拾");
break;
case 2:
result.append("佰");
break;
case 3:
result.append("仟");
break;
}
if (count4 % 4 == 1 && s1[0].charAt(i) == '1') {
count4++;
i--;
continue;
}
boolean isZero = false;
while (s1[0].charAt(i) == '0') {
count4++;
i--;
isZero = true;
}
if (isZero) {
result.append("零");
continue;
}
result.append(numbers[s1[0].charAt(i) - '0' - 1]);
count4++;
i--;
}
}
result.append("币民人");
result.reverse();
System.out.println(result);
}
}

京公网安备 11010502036488号