问题描述
Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。
比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。
所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法:
十二亿三千四百五十六万七千零九
用汉语拼音表示为
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
这样他只需要照着念就可以了。
你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。
注意必须严格按照规范,比如说“10010”读作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”读作“shi wan”而不是“yi shi wan”,“2000”读作“er qian”而不是“liang qian”。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String value = input.next();
input.close();
System.out.println(helper1(value));
}
public static String helper1(String n) {
if (n.equals("0"))
return "〇";
int a = n.length();
if (a <= 8) {
return helper5(n);
} else {
int b = a % 8;
if (b != 0) {
StringBuilder s = new StringBuilder(helper5(n.substring(0, b))).append("亿");
int c = a - b;
for (int i = b; c != 0; i = i + 8) {
c = c - 8;
if (c==0)
s.append(helper5(n.substring(i, i + 8)));
else
s.append(helper5(n.substring(i, i + 8))).append("亿");
}
return s.toString();
} else {
StringBuilder s = new StringBuilder();
int c = a;
for (int i = 0; c != 0; i = i + 8) {
c = c - 8;
if (c==0)
s.append(helper5(n.substring(i, i + 8)));
else
s.append(helper5(n.substring(i, i + 8))).append("亿");
}
return s.toString();
}
}
}
public static String helper2(int n) {
switch (n) {
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 "error";
}
}
public static String helper3(int n, int m) {
if (m == 0 && n == 1) {
return null;
} else if (m == 0) {
return "〇";
} else {
switch (n) {
case 1:
return helper2(m);
case 2:
return helper2(m) + "十";
case 3:
return helper2(m) + "百";
case 4:
return helper2(m) + "千";
case 5:
return helper2(m) + "万";
default:
return "error";
}
}
}
public static String helper4(String n) {
List<String> m = new ArrayList<>();
for (int i = String.valueOf(n).length(); i > 0; i--) {
int a = String.valueOf(n).length() - i;
int j = Integer.parseInt(n.substring(a, a + 1));
String b = helper3(i, j);
if (m.size() > 0) {
if (b != null && !(m.get(m.size() - 1).equals("〇") && b.equals("〇")))
m.add(b);
} else m.add(b);
}
if (m.get(0).equals("一十"))
m.set(0, "十");
if (m.get(m.size() - 1).equals("〇"))
m.remove(m.size() - 1);
StringBuilder s = new StringBuilder();
for (String value : m) {
s.append(value);
}
return s.toString();
}
public static String helper5(String n) {
int a = n.length();
if (a <= 5)
return helper4(n);
else {
int b = a % 4;
if (b == 0)
b = 4;
return helper4(n.substring(0, b)) + "万" + helper4(n.substring(b));
}
}
}
/*
*helper1循环,可以读出无限大的数
*helper2,helper3没什么好解释的
*helper4处理需要注意的读数特点,helper4可以读出4位以内的数,读数以4位作为8位的单位故如此处理
*helper5,可以读取8位以内的数,并作为更大数的单位
*/