题解 | #学英语#
学英语
https://www.nowcoder.com/practice/1364723563ab43c99f3d38b5abef83bc
思路:在英语读法中3位数字看成一整体,后面再加计数单位,故实际上任何一个n都可以视为多个3位数的拼接,只需将每个3位数都转换为英文,再和million,thousand等关联词进行拼接,即可进行翻译,需要注意考虑一些特殊情况下hundred、and和空格是否存在。
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextInt()) { long n = sc.nextLong(); String s = String.valueOf(n); int len = s.length(); StringBuilder res = new StringBuilder(); //根据n(0-2000000)的位数大小,分情况讨论:1-3位数,4-6位数,7-9位数 //将n按3位截断,用numberToenglish(s)方法转换成英文再和million、thousand进行拼接即得结果 if (len <= 3) { res.append(numberToenglish(s)); } else if (len <= 6) { res.append(numberToenglish(s.substring(0, len - 3))); res.append(" thousand"); //如果后三位为0,则不用拼接 if (Integer.parseInt(s.substring(len - 3)) > 0) { res.append(" "); res.append(numberToenglish(s.substring(len - 3))); } } else if (len > 6) { res.append(numberToenglish(s.substring(0, len - 6))); res.append(" million"); //如果中三位为0,则thousand部分不用拼接 if (Integer.parseInt(s.substring(len - 6, len - 3)) > 0) { res.append(" "); res.append(numberToenglish(s.substring(len - 6, len - 3))); res.append(" thousand"); } //如果后三位为0,则不用拼接 if (Integer.parseInt(s.substring(len - 3)) > 0) { res.append(" "); res.append(numberToenglish(s.substring(len - 3))); } } System.out.println(res.toString()); } } //将一个000-999的三位数字符串转换为英文 public static String numberToenglish(String s) { HashMap<Integer, String> m = new HashMap<>(); m.put(0, ""); m.put(1, "one"); m.put(2, "two"); m.put(3, "three"); m.put(4, "four"); m.put(5, "five"); m.put(6, "six"); m.put(7, "seven"); m.put(8, "eight"); m.put(9, "nine"); m.put(10, "ten"); m.put(11, "eleven"); m.put(12, "twelve"); m.put(13, "thirteen"); m.put(14, "fourteen"); m.put(15, "fifteen"); m.put(16, "sixteen"); m.put(17, "seventeen"); m.put(18, "eighteen"); m.put(19, "nineteen"); m.put(20, "twenty"); m.put(30, "thirty"); m.put(40, "forty"); m.put(50, "fifty"); m.put(60, "sixty"); m.put(70, "seventy"); m.put(80, "eighty"); m.put(90, "ninety"); //将三位数字符串前面的0去除,避免000,001,011等情况 if (s.charAt(0) == '0') { s = s.substring(1); if (s.charAt(0) == '0') { s = s.substring(1); if (s.charAt(0) == '0') { return ""; } } } //根据该三位数字符串的位数分情况讨论 if (s.length() == 1) { return m.get(Integer.parseInt(s)); } else if (s.length() == 2) { //10-19有专门的英文单词,故需要单独讨论 if (s.charAt(0) == '1') { return m.get(Integer.parseInt(s)); } else { //得出个位数 以及 整十(不是十位数) int single = Integer.parseInt(String.valueOf(s.charAt(1))); int ten = Integer.parseInt(s) - Integer.parseInt(String.valueOf(s.charAt(1))); //注意如果个位数为0,则中间空格不用拼接 if (single == 0) { return m.get(ten); } else { return m.get(ten) + " " + m.get(single); } } } else { //得出百位数、个位数 以及 整十(不是十位数) int hundred = Integer.parseInt(String.valueOf(s.charAt(0))); int single = Integer.parseInt(String.valueOf(s.charAt(2))); int ten = Integer.parseInt(s.substring(1)) - Integer.parseInt(String.valueOf( s.charAt(2))); StringBuilder sb = new StringBuilder(); sb.append(m.get(hundred) + " hundred"); if (s.charAt(1) == '1') { sb.append(" and " + m.get(Integer.parseInt(s.substring(1)))); } else { //根据十位数、个位数是否为0,分情况进行判断 if (s.charAt(1) != '0' || single != 0) { sb.append(" and"); if (s.charAt(1) != '0') { sb.append(" " + m.get(ten)); } if (single != 0) { sb.append(" " + m.get(single)); } } } return sb.toString(); } } }