解题思路:

  • 将数据段 分为四个部分,
  • getNumsEnglish 去翻译所有的三位数,最终拼接单位;
  • 以下俩个main函数测试之后均可用。
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
  /*
   public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Long input = in.nextLong();
        String num = String.valueOf(input);

         // 定死数据为4个段
        String[] str = new String[4];
        int index = num.length();
        int x = 3;
        while (index >= 3) {
            str[x] = num.substring(index - 3, index);
            x--;
            index -= 3;
        }
        if (index != 0) str[x] = num.substring(0, index);

        String[] yi = new String[]{"", "thousand", "million", "billion"};

        StringBuilder sb = new StringBuilder();
        // 数据正写,反读,单位反安排,个千百万亿 倒着读。
        for (int i = str.length - 1; i >= 0; i--) {
            StringBuilder sbChild = getNumsEnglish(str[i]);
            if (sbChild != null)
                sb.insert(0, sbChild.append(" ").append(yi[str.length - 1 - i]).append(" "));
        }

        System.out.println(sb.toString());
    }
  */
  
  
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Long input = in.nextLong();
        String num = String.valueOf(input);

        // 最高三位 有几位数
        int m = num.length() % 3;
        // n + 1个三位数
        int n = num.length() / 3;  // =3 & m!=0  则 四个位数;

         // 重置m
        n = num.length() >= 3 && m == 0 ? n : n + 1;
        m = num.length() >= 3 && m == 0 ? 3 : m;

        String[] str = new String[n];
        str[0] = num.substring(0, m);

        // 大于三位数
        if (n > 1 || num != "100") {
            int x = m;
            int i = 1;
            while (x != num.length()) {
                str[i] = num.substring(x, x + 3);
                i++;
                x += 3;
            }
        }

        String[] yi = new String[]{"", "thousand", "million", "billion"};

        StringBuilder sb = new StringBuilder();
        for (int i = str.length - 1; i >= 0; i--) {
            sb.insert(0, getNumsEnglish(str[i]).append(" ").append(yi[str.length - 1 - i]).append(" "));
        }

        System.out.println(sb.toString());
    }

    // 一二三
    private static String[] otth = new String[] {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
            "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"
                                                };
    // 整数十位
    private static String[] zhengshuShi = new String[] {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

    // 翻译三位数
    public static StringBuilder getNumsEnglish(String nums) {
        StringBuilder sb = new StringBuilder();
        if (nums == null || nums.equals("")) return sb;

        int n = Integer.parseInt(nums);

        int ge = n % 10;
        int shi = n % 100 / 10;
        int bai = n / 100;

        // 1-10
        if (n / 10 == 0) {
            sb.append(otth[ge]);
            return sb;
        }

        // 三位数的特殊处理
        if (n / 1000 == 0  &&  n/100 != 0) {
            // 三位数
            sb.append(otth[bai]).append(" hundred");
            if (shi == 0 && ge == 0) return sb;
            if (shi != 0 || ge != 0) {
                sb.append(" and ");
            }
        }

        // 追加两位数
        if (shi == 1) {
            int geshi = n % 100;
            sb.append(otth[geshi]);
        } else {
            if (ge == 0) sb.append(zhengshuShi[shi]);
            else if( shi==0) sb.append(otth[ge]);
            else sb.append(zhengshuShi[shi]).append(" ").append(otth[ge]);
        }

        return sb;
    }
}