蓝桥志9——数的读法

问题

给定一个阿拉伯数字串,按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。
  注意必须严格按照规范,比如说“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

代码

package basequestion;
import java.util.Scanner;
//* 分组,4个4个看,每四个需要加一个单位,最开始4个不需要,问题在这4个怎么解析
//* 单位不应该分成亿,万,而应该分成亿,万,千,百,十
//* 普通的4位直接一位一位解析,数是几就是几加上单位:1234——1千2百3十4
//* 特殊的,有0,数就变得特殊了。10——十,100
//* 怎么处理10读成shi而不是yi shi,还有1000怎么搞
public class Question19_Read_number {
/*思路3:直接从前往后读,一位一位地读
 * 整体框架是for循环
 * 里面分情况输出
 * 分成两种情况:遇到0和非0
 * 非0最简单,数字加单位输出,但题目对10——19有特殊要求,所以要判断,遇到时不能输出yi
 * 遇到0,输出无外乎两种情况,输出0(它后面地位里边不全位0)和break结束(后面全为0)
 * !错,这里想错了,还有一种情况,当0在4位的末位时,是要输出单位的
 * break简单,从后往前遍历全为0则break结束
 * 接下来考虑输出零地情况,如果接连几个0,就有重复输出0的情况,所以输出0考虑的就是重复输出的问题。
 * 怎样避免重复输出呢,
 * */
/*public class Question19_Read_number {
	private  static String[] s_danwei = {"","shi","bai","qian","wan","yi"};
	private static String[] s_pinyin = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	private static String trans_4wei(String s) {
		if(s.equals("0") || s.equals("0000"))
			return "ling";
		String start_string = "";
		while(s.startsWith("0")) {
			start_string = "ling";
			s = s.substring(1, s.length());
		}
		String res_string = "";
		char[] char_num = s.toCharArray();
		int i = 0;
		for(i = 0 ; i < char_num.length-1; i++) {
			res_string += s_pinyin[char_num[i]-'0']+" "+s_danwei[char_num.length-i-1]+" ";
		}
		if(start_string.isEmpty())
			res_string = res_string+s_pinyin[char_num[i]-'0'];
		else
			res_string = start_string + " " + res_string+s_pinyin[char_num[i]-'0'];
		return res_string;
	}

	private static String trans_all(String s) {
		//分段解析,不超过4位用封装好的函数直接解析
		//不超过8位切割字符串,分两段解析
		//否则分三段解析
		//4位看成一段,每段都有单位,第一段的单位是亿,第二段单位是万,第三段是空
		//需要注意的是如果四位数全0是不读的,即没有单位,在解析超过4位和超过8位的情况下要单独判断
		if (s.length() <= 4)
			return format(trans_4wei(s));
		else if (s.length() <= 8) {
			String s_temp1 = s.substring(0, s.length() - 4);
			// !!!注意应该从后往前取4位
			String s_temp2 = s.substring(s.length() - 4, s.length());
			String result = format(trans_4wei(s_temp1) +
					" " + s_danwei[4] + " " +
					trans_4wei(s_temp2));
			return result;
		} else {
			String s_temp1 = s.substring(0, s.length() - 8);
			String s_temp2 = s.substring(s.length() - 8, s.length() - 4);
			String s_temp3 = s.substring(s.length() - 4, s.length());
			String result =
			  format(format(trans_4wei(s_temp1)) + " " + s_danwei[5] + " " +
					 trans_4wei(s_temp2) + " "+ s_danwei[4] + " " +
					trans_4wei(s_temp3));
			return result;
		}
	}
	private static String format(String s) {
		if(s.equals("ling")) 
			return "ling";
		else if(s.equals("yi shi ling"))
			return "shi";
		else if(s.startsWith("yi shi"))
			s = s.replaceAll("yi shi", "shi");
		else{
			s = s.replace("ling wan", "ling");
			s = s.replace("ling bai", "ling");
			s = s.replace("ling shi", "ling");
			s = s.replace("ling ling", "ling");
			while(s.endsWith("ling")) {
				s = s.substring(0,s.length()-5);
			}
			if(s.endsWith(" "))
				s = s.substring(0, s.length()-1);
		}			
		return s;
	}
		
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int x = sc.nextInt();
		String s = String.valueOf(x);
		System.out.println(trans_all(s));
	}
}

经验

  • ’==‘判断的是变量地址是否相等
  • 比较字符串是否相等用String.equal()
  • 人的视角下123456这样一个数的位是:个 十 百 千 万 十万 百万 千万 亿
    而在计算机角度下数有了一种全新的构成表达形式,个 十 百 千 万 十 百 千 亿。
  • 字符串的一些函数:startsWith(),endWith(),subString(start,end),replace(old,new)是真的好用!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值