基础练习 数的读法 蓝桥杯 JAVA

试题 基础练习 数的读法

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  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

思路灵感来源
https://blog.csdn.net/csdn_lipoet/article/details/46011783
但是上面的代码虽然是可以运行通过 但是对于十万到十一万 十亿到十一亿会出错误。
对于上面进行了优化和详解
再来说说本题的思路,先定义两个数组 一个代表数字 一个代表在什么位。
String[] num = { "ling ", "yi ", "er ", "san ", "si ", "wu ", "liu ", "qi ", "ba ", "jiu " };
String[] wei = { “”, "shi ", "bai ", "qian ", "wan ", "shi ", "bai ", "qian ", "yi ", "shi ", "bai " };
然后把输入的n 变成字符串 String ss = n + “”; // 把输入的数转换成字符串
然后开始判断从一个数开始每个数是多少 用一个字符串装结果 每次都是 num[]+wei[]
对于其中一些特殊的数 比如100000 要读shi wan 而不是 yi ling 这就是等待代码里需要判断的了

上代码

import java.util.Scanner;

public class 数的读法 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		input.close();
		appendString(n);
	}

	private static void appendString(int n) {
		int i, j;
		String[] num = { "ling ", "yi ", "er ", "san ", "si ", "wu ", "liu ", "qi ", "ba ", "jiu " };
		String[] wei = { "", "shi ", "bai ", "qian ", "wan ", "shi ", "bai ", "qian ", "yi ", "shi ", "bai " };
		String ss = n + ""; // 把输入的数转换成字符串
		String result = new String(); //定义一个result存放结果
		boolean L = true;  //这里的l在后面有用 刚开始代表true 		
		for (i = 0; i < ss.length(); i++) {  
			for (j = 0; j <= 9; j++)
				if (ss.charAt(i) == j + '0') { // 判断字符串从第一个字符开始,每个字符等于0加几,相当于获取每个字符对应的数值
					break;   //j=几字符就是多少  对于本题我们拿1234567009 举例
				}
			if ((ss.length() + 2) % 4 == 0 && i == 0 && j == 1) { // 10位数,6位数,2位数,并且第一个字符为1
				if(n>100000000&&n<1100000000) {       //这里就是解决十亿到十一亿的问题
					result += wei[ss.length() - i - 1]+wei[ss.length() - i - 2];
				}else if(n>=100000&&n<110000) {       //这里是解决十万到十一万的问题
					result += wei[ss.length() - i - 1]+wei[ss.length() - i - 2];
				}
				else	result += wei[ss.length() - i - 1];  // 都为“shi”  这里是解决shi的问题
				//对于1234567009  十位数是一 所以 得到 result此时等于 shi 
				//再开始依次判断2就是result += num[j] + wei[ss.length() - i - 1]; 输出数字大小和位数
				//一直是shi er yi san qian si bai wu shi liu wan qi qian 都没问题 
				//那么接下来对于0进行判断处理
			} else if (i != ss.length() - 1 && j == 0) { // 不是最后一个字符并且为0
				if (L) { //这是第一次出现0,直接加一个ling
					result += num[j]; 
					L = false; // 把l 变成false 代表已经加了0 后面再加0就加不了了 因为 if(l) 不执行了;
					 //但是只要中间输出过一个非0数 那么又可以输入0了 也就是说 在输出其它数的适合 把l 要变成true
				}
			} else if (i == ss.length() - 1 && j == 0) { // 最后一位且为0
				if (!L) // 如果最后一位也是0,且前面是0,那么此时的!L就是true 可以运行 
					    //如果最后一位是0,前面不是0,那么此时的!L是false 跳过
					result = result.substring(0, result.length() - 5);// 如果最后一个也为0,则去掉之前添加的 ling
			} else { // 如果是普通的数据,则转换
				result += num[j] + wei[ss.length() - i - 1];
				L = true; // 出现真正的数字,后边可以跟“ling”,设为true
			}
		}
		System.out.println(result);
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏末微风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值