【华为机试043】学英语

题目描述:

Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:

如22:twenty two,123:one hundred and twenty three。

 

说明:

数字为正整数,长度不超过九位,不考虑小数,转化结果为英文小写;

输出格式为twenty two;

非法数据请返回“error”;

关键字提示:and,billion,million,thousand,hundred。

Java实现:

扫描二维码关注公众号,回复: 2120378 查看本文章
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    /*
    规则1:3位一组
     */
    private static final HashMap<String, String> numMap = new HashMap<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        numMap.put("0", "zero");
        numMap.put("1", "one");
        numMap.put("2", "two");
        numMap.put("3", "three");
        numMap.put("4", "four");
        numMap.put("5", "five");
        numMap.put("6", "six");
        numMap.put("7", "seven");
        numMap.put("8", "eight");
        numMap.put("9", "nine");
        numMap.put("10", "ten");
        numMap.put("11", "eleven");
        numMap.put("12", "twelve");
        numMap.put("13", "thirteen");
        numMap.put("14", "fourteen");
        numMap.put("15", "fifteen");
        numMap.put("16", "sixteen");
        numMap.put("17", "seventeen");
        numMap.put("18", "eighteen");
        numMap.put("19", "nineteen");
        numMap.put("20", "twenty");
        numMap.put("30", "thirty");
        numMap.put("40", "forty");
        numMap.put("50", "fifty");
        numMap.put("60", "sixty");
        numMap.put("70", "seventy");
        numMap.put("80", "eighty");
        numMap.put("90", "ninety");

        while (sc.hasNext()) {
            Long num = Long.valueOf(sc.next());
            String numStr = num.toString();
            if (isValid(numStr)) {
                StringBuilder sb = new StringBuilder();
                int length = numStr.length();
                if (length < 4) {
                    System.out.println(under3(numStr, numMap));
                } else if (length < 7) {
                    String tmp1 = numStr.substring(0, length-3);
                    String tmp2 = numStr.substring(tmp1.length(), length);
                    sb.append(under3(tmp1, numMap));
                    sb.append(" ");
                    sb.append("thousand");
                    sb.append(" ");
                    sb.append(under3(tmp2, numMap));
                    System.out.println(sb.toString());

                } else {
                    String tmp1 = numStr.substring(0, length-6);
                    String tmp2 = numStr.substring(tmp1.length(), length-3);
                    String tmp3 = numStr.substring(tmp1.length()+tmp2.length(), length);
                    sb.append(under3(tmp1, numMap));
                    sb.append(" ");
                    sb.append("million");
                    sb.append(" ");
                    sb.append(under3(tmp2, numMap));
                    sb.append(" ");
                    sb.append("thousand");
                    sb.append(" ");
                    sb.append(under3(tmp3, numMap));
                    System.out.println(sb.toString());
                }
            }
            else
                System.out.println("error");
        }
    }
    private static boolean isValid(String numStr) {
        if (numStr.contains(".")||numStr.contains("-"))
            return false;
        if (numStr.length() > 9)
            return false;
        return true;
    }

    private static String under3(String s, HashMap numMap) {
        StringBuilder sb = new StringBuilder();
        int n = Integer.valueOf(s);
        int bw = n / 100;
        int other = n - bw*100;
        if (bw != 0 ) {
            sb.append(numMap.get(bw+""));
            sb.append(" ");
            sb.append("hundred and ");
        }
        sb.append(under2(String.valueOf(other), numMap));
        return sb.toString();
    }

    private static String under2(String s, HashMap numMap) {
        StringBuilder sb = new StringBuilder();
        int n = Integer.valueOf(s);
        int gw = n % 10;
        n /= 10;
        int sw = n;
        if (sw != 0 && gw != 0) {
            if (sw == 1) {
                sb.append(numMap.get(s));
            } else
                sb.append(numMap.get(sw+"0")).append(" ").append(numMap.get(gw+""));
        } else if (sw !=0 && gw == 0) {
            sb.append(numMap.get(sw+"0"));
        } else {
            sb.append(numMap.get(gw+""));
        }
        return sb.toString();
    }
}

知识点:

  • 27个固定表达存储在一个HashMap中便于取用
  • million和thousand后没有and,hundred后有and
  • 英文的表达习惯是3位一组,将3位数的表达抽象出来作为函数

猜你喜欢

转载自blog.csdn.net/heyiamcoming/article/details/80987638