题解 | #人民币转换# 用例都通过了,但是绝对有问题

人民币转换

https://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b?tpId=37&tqId=21318&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D2%26pageSize%3D50%26search%3D%26tpId%3D37%26type%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

首先声明我这个解绝对有错的,100101010.00这个用例解出来的是人民币壹仟零零壹零壹仟零拾元整,明显有问题,甚至没有写对 十万以上的数字接千不用加“零” 的处理但是居然通过了???而且速度非常快!居然还挤上了Java排行榜的第一百名????大家有兴趣来看看我这个应该怎么改,实在是找不出来了。。

也是暴力方法,每遍历一个阿拉伯数字,就在答案字符串中 先加入中文数字,再匹配并加入 中文单位

匹配单位的方法主要是,中文读写数字的规律是每四位是一个循环,每到万的时候进位例如,万,亿,万亿,用字符串第i个字符的在正常读写中位置除以5,用余数来确定是个,十,百还是千,余0的时候即在”万“位的时候if()语句单独处理

// v index 匹配单位时是从左往右遍历的

//千 百 十 个 (亿) 千 百 十 个 (万) 千 百 十 个 ->

//14 13 12 11 10 9 8 7 6 5 4 3 2 1 <-

// ^ length-index

//用长度减下标即可得到这个字符是第几位的,intUnitTranslate()方法就是传入参数moneyInt.length()-i

import java.util.*;
import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = "";
        while ((str = br.readLine())!=null) { // 注意 while 处理多个 case
            String[] s = str.split("\\.");
            String moneyInt = s[0];
            String moneyDec = s[1];
            System.out.println("人民币"+solutionInt(moneyInt)+solutionDec(moneyDec));
        }
    }
    //   v  index
    //千 百 十 个 (亿) 千 百 十 个 (万) 千 百 十 个 ->
    //14 13 12 11 10  9  8  7  6   5  4  3  2  1 <-
    //   ^  length-index-1
    public static String solutionInt(String moneyInt){	//整数部分
        String str = "";
        if(Integer.parseInt(moneyInt)!=0){
            for(int i=0;i<moneyInt.length();i++){
                str += translate(Integer.parseInt(moneyInt.charAt(i)+""));
                if(i >= 2 && moneyInt.charAt(i) == 0 && moneyInt.charAt(i-1) == 0)
                    str = str.substring(0,str.length()-2);	//连续零出现时去掉加多的零
                if(moneyInt.charAt(i)!='0'){
                    if((moneyInt.length()-i)%5==0 && moneyInt.length()-i-1==10){
                        str+="亿";	//这个时候加亿,就不用调intUnitTranslate()方法求单位了
                    }else if((moneyInt.length()-i)%5==0){
                        str+="万";	//同上
                    }else{
                        if(translate(Integer.parseInt(moneyInt.charAt(i)+"")).equals("壹")
                        && intUnitTranslate(moneyInt.length()-i).equals("拾")){
                            if(str.length()>1)		//出现壹拾的时候把壹去掉,后面再正常加单位
                                str = str.substring(0,str.length()-1); 
                            else
                                str="";
                        }
                        str += intUnitTranslate(moneyInt.length()-i);
                    }  
                }
            }
		  //前面只做了零去重,所以创建好整数字符串后,如果最后一位是零则去掉
            if(str.charAt(str.length()-1)=='零')	
                str = str.substring(0,str.length()-1);
            str+="元";
        }
        return str;
    }
    public static String intUnitTranslate(int now){ //匹配整数部分单位
        int temp = now%5;
        switch(temp){
            case 1:
                return "";
            case 2:
                return "拾";
            case 3:
                return "佰";
            case 4:
                return "仟";
        }
        return "";
    }
    public static String solutionDec(String moneyDec){	//小数部分
        String str = "";
        if(moneyDec.equals("00")){
            return "整";
        }else{
            if(moneyDec.charAt(0)=='0'){
                return translate(Integer.parseInt(moneyDec.charAt(1)+""))+"分";
            }else if(moneyDec.charAt(1)=='0'){
                return translate(Integer.parseInt(moneyDec.charAt(0)+""))+"角";
            }else{
                str+=translate(Integer.parseInt(moneyDec.charAt(0)+""))+"角";
                str+=translate(Integer.parseInt(moneyDec.charAt(1)+""))+"分";
            }
        }
        return str;
    }

    public static String translate(int i){		//将阿拉伯数字翻译为中文数字
        switch(i){
            case 0:
                return "零";
            case 1:
                return "壹";
            case 2:
                return "贰";
            case 3:
                return "叁";
            case 4:
                return "肆";
            case 5:
                return "伍";
            case 6:
                return "陆";
            case 7:
                return "柒";
            case 8:
                return "捌";
            case 9:
                return "玖";
            default:
                return "";
        }
    }
}

#悬赏#
全部评论

相关推荐

想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务