题解 | #人民币转换# 用例都通过了,但是绝对有问题
人民币转换
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 ""; } } }#悬赏#