第二次提交通过,很意外啊。将数字字符串按小数点分开,先处理小数部分,再处理整数部分。每一部分都从低位开始,即小数里面先处理分再处理角,整数里面按个位、十位、百位、千位……的顺序处理。数字的转换有个小技巧,将人民币大写的数字字符按从小到大的顺序存在字符数组中,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);
    }
}