蓝桥杯_基础练习_数的读法
问题
问题描述
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”。
输入格式
有一个数字串,数值大小不超过2,000,000,000。
输出格式
是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。
样例
-
输入
1234567009 -
输出
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
问题解决
主要思路
-
我们首先需要四个方法,分别是:
每四位分为一段
的函数split()
- 判断一共分了几段,将分段后的每段数传进
f1()
,并按条件后面加上yi
、wan
- 再细化将每段数分为每个数字,然后添加好
qian
、bai
、shi
。再将完成的每段数传给relace()
- 最后用
relace()
替换好一些不合要求的数值。
-
主要比较麻烦,细心的注意点格式。
代码
import java.util.Scanner;
public class Main {
static String[] du = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
public static void main(String[] args) {
String n = (new Scanner(System.in)).next();
String resout = f2(Split(n));
System.out.println(relace(resout));
}
//每个段后面跟着的单位,并传入更加细化的f1()
private static String f2(String[] arr) {
if (arr.length ==1) {
return f1(arr[0]);
}else if (arr.length ==2) {
return f1(arr[0])+" wan "+f1(arr[1]);
}else {
return f1(arr[0])+" yi "+f1(arr[1])+" wan "+f1(arr[2]);
}
}
//将每个段内每个数字进行读出“读法”,追加符号 并且 传入relace()
private static String f1(String x) {
String firstZero = "";
while (x.startsWith("0")) {
x=x.substring(1,x.length());
firstZero="ling ";
}
String resString="";
if (x.length()==1) {
resString= (firstZero + du[x.charAt(0)-48]);
}else if (x.length()==2) {
resString= (firstZero+du[x.charAt(0)-48]+" shi "+du[x.charAt(1)-48]);
}else if (x.length()==3) {
resString=(firstZero+du[x.charAt(0)-48]+" bai "+du[x.charAt(1)-48]+" shi "+du[x.charAt(2)-48]);
}else if(x.length()==4){
resString=(firstZero+du[x.charAt(0)-48]+" qian "+du[x.charAt(1)-48]+" bai "+du[x.charAt(2)-48]+" shi "+du[x.charAt(3)-48]);
}
return relace(resString);
}
// 处理一些有问题的数据。
private static String relace(String resString) {
resString = resString.replace("ling wan", "wan");
resString = resString.replace("ling bai", "ling");
resString = resString.replace("ling shi", "ling");
resString = resString.replace("ling ling", "ling");
if (resString.endsWith(" ling")) {
resString =resString.substring(0,resString.length()-5);
}
if (resString.startsWith("yi shi")) {
resString =resString.replace("yi shi", "shi");
}
if (resString.endsWith(" wan ")) {
resString =resString.replace(" wan ", "");
}
return resString;
}
// 按每四位分成几段
private static String[] Split(String n) {
int t = (int) Math.ceil((double)n.length()/4);
String[] arr = new String[t];
for (int i=t-1; i>0; i--) {
arr[i]=n.substring(n.length()-4, n.length());
n=n.substring(0, n.length()-4);
}
arr[0]=n;
return arr;
}
}