写在最前:欢迎批评,欢迎任意地方的指正,用你们的优秀的java代码砸死我吧!!
问题————————————
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
解题思路:
用java很简单,直接以字符串来读取一行数据,转换成字符数组遍历相加就可以,再把结果变为字符数组遍历,使用switch往结果中添加对应数字的拼音。这里使用了BufferedReader和StringBuilder这两个东西,简单说下BufferReader缓冲读取,速度方面要比Scanner挨个字符地读取要快的多,这个优点在几千个数据的时候就已经变得相当明显,java最大的劣势就是时间,所以要尽量使用速度快的方式。众所周知String其实不算变量,他在赋值和改变的时候是新建一个新的String然后再改变索引,所以不可避免的速度就要慢,StringBuilder是一个变量,修改的时候速度要比String快的多,所以这里使用append()来进行增加。
package not.die.in.here;
//满分20
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class _1002_WriteTheNum {
public static void main(String[] args)throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
char[] buf = bf.readLine().toCharArray();//变为字符数组处理
int sum = 0;
for(int i=0;i<buf.length;i++) {
sum+=(buf[i]-48);//减48直接转换成对应的int数值
}
char[] result = ((Integer)sum).toString().toCharArray();//和直接转换成字符数组
StringBuilder sb = new StringBuilder("");
for(int i=0;i<result.length;i++) {
switch(result[i]) {//挨个添加拼音
case '0':sb.append("ling");break;
case '1':sb.append("yi");break;
case '2':sb.append("er");break;
case '3':sb.append("san");break;
case '4':sb.append("si");break;
case '5':sb.append("wu");break;
case '6':sb.append("liu");break;
case '7':sb.append("qi");break;
case '8':sb.append("ba");break;
case '9':sb.append("jiu");break;
}
sb.append(" ");//添加空格
}
System.out.println(sb.toString().trim());//去除多余空格输出
}
}