基础练习 数的读法蓝桥杯 JAVA_用java语言实现 基础练习 数的读法-程序员宅基地

技术标签: 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

二、解题思路
观察可发现,可以把每四位数当作一个单位,它们的读法规则都相同,再往中间加入“万”、“亿”即可。例如:1234:一千二百三十一 ;
12345678:一千二百三十一万五千六百七十八 ;
123412345678:一千二百三十四亿一千二百三十四万五千六百七十八 ;
ps.题中要求数字大小不超过二十亿。

所以此题详细解题步骤为:
①写一个函数 f1(),能把一个四位数读出来。
②写一个函数 split(),能把一串数字分割成若干个四位数。
③写一个函数 f2(),能利用f1()函数和split()函数 读出一串数字。
④写一个函数 deal(),用来处理非法的读法,如:“0741”会读成“零千七百四十一”;
“7041”会读成“七千零百四十一” ; “7401”会读成“七千四百零十一” ; “7410”会读成“七千四百一十零”等; 以及双零问题。

三、代码
————————————————
这题这位博主做的很清楚
版权声明:本文为CSDN博主「easycodesniper」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27859693/article/details/87548462

import java.util.Scanner;

public class Main {
    
	static String[] du = {
    "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	static String deal(String s){
    //处理非法读法
			s=s.replace("ling wan", "wan");
			s=s.replace("ling bai", "ling");
			s=s.replace("ling shi", "ling");
			s=s.replace("ling ling", "ling");
			if(s.endsWith(" ling")) //末尾的零不读
				s=s.substring(0,s.length()-5);
			if(s.startsWith("yi shi")) //开头的10不读做“一十”而读作“十”
				s = s.replace("yi shi", "shi");
			if(s.endsWith("  wan ")) //避免出现1,0000,0000被读成“yi yi  wan ”;
			    s = s.replace("  wan ", "");
		return s;
	}
	static String[] split(String s){
    //将一串数字从后往前分为若干个四位数,如123456789会被分成:1  2345   6789
		 int t = (int)Math.ceil((double)s.length()/4);
		 String[] res = new String [t];
		 for(int i=t-1;i>0;i--){
    
			 res[i]= s.substring(s.length()-4,s.length());
			 s=s.substring(0,s.length()-4);
		 }
		 res[0] = s;
		 return res;
	}
	static String f1(String s){
    //把一个四位数读出来
		String fristZero=""; 
		while(s.startsWith("0")){
      //如果最开头是零
			s=s.substring(1,s.length());
			fristZero="ling ";
		}
		String res="";
		if(s.length()==1)
			res = fristZero + du[s.charAt(0)-48];
		else if (s.length()==2)
			res = fristZero + du[s.charAt(0)-48]+" shi "+du[s.charAt(1)-48];
		else if (s.length()==3)
			res = fristZero + du[s.charAt(0)-48]+" bai "+du[s.charAt(1)-48]+" shi "+du[s.charAt(2)-48];
		else if (s.length()==4)
			res = fristZero + du[s.charAt(0)-48]+" qian "+du[s.charAt(1)-48]+" bai "+du[s.charAt(2)-48]+" shi "+du[s.charAt(3)-48];
		return deal(res);
	}
	static String f2(String[] s){
     //把一串数字读出来
		if(s.length == 1)
			return f1(s[0]);
		else if(s.length == 2)
			return f1(s[0]) + " wan " + f1(s[1]);
		else if(s.length == 3)
			return f1(s[0]) + " yi " + f1(s[1]) + " wan " + f1(s[2]);
		return "error!";
	}
	public static void main(String[] args){
    
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		String res = f2(split(s));
		System.out.println(deal(res)); //最后把非法的读法都处理掉
	}
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44288584/article/details/104518000

智能推荐

如何定制丝网印刷电极-程序员宅基地

文章浏览阅读30次。丝网印刷电极(Screen-printed electrodes,SPE)是利用印刷技术将碳胶、银胶等各类不同胶材,以不同的设计图样印刷于不易溶解于水的基板/底板上而得到的电极。我们要再聊一下当市售电极无法满足实验需求是该如何定制化丝网印刷电极的。

【张兔兔送书第一期:考研必备书单】-程序员宅基地

文章浏览阅读4k次,点赞55次,收藏55次。八九月的朋友圈刮起了一股晒通知书潮,频频有大佬晒出“研究生入学通知书”,看着让人既羡慕又焦虑。果然应了那句老话——比你优秀的人,还比你努力。

链路追踪php,easyswoole链路追踪-程序员宅基地

文章浏览阅读543次。TrackerEasyswoole提供了一个基础的追踪组件,方便用户实现基础的服务器状态监控,与调用链记录。组件要求php: >=7.1.0ext-swoole: ^4.4.0easyswoole/component: ^2.0安装方法composer require easyswoole/tracker仓库地址调用链Easyswoole的调用链跟踪是一个以类似有序的树状链表的解构实现的,解..._php 链路追踪

【云计算概念】IaaS、PaaS、SaaS、CaaS、MaaS的区别-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏3次。五者之间主要的区别在于第一个单词,而都是(即服务)的意思,这五者都是云计算的落地产品。

下班的时候在电梯里碰见个妹子,问这层楼是哪个部门的。我答技术部吧。她惊异:技术部也这么晚下班?妹子,你听说过科比和程序员的故事么?-程序员宅基地

文章浏览阅读1.4k次。下班的时候在电梯里碰见个妹子,问这层楼是哪个部门的。我答技术部吧。她惊异:技术部也这么晚下班?妹子,你听说过科比和程序员的故事么?转自:程序猿才懂得笑话 http://cxmonkey.duapp.com/?p=222

【0day】复现用友 NC NCFindWeb大型企业数字化平台log4j远程代码执行漏洞-程序员宅基地

文章浏览阅读220次。NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。用友 NC NCFindWeb大型企业数字化平台存在log4j远程代码执行漏洞,攻击者可以在恶意环境变量中插入特定的代码,使得Log4j执行该代码。_用友 nc ncfindweb大型企业数字化平台log4j远程代码执行漏洞

随便推点

Android页面跳转动画简介_android 页面跳转动画-程序员宅基地

文章浏览阅读382次。在项目中常用到的页面跳转的方式主要有两种:1、通过在startActivity后执行overridePendingTransition方法进行动画的切换。overridePendingTransition(R.anim.left_in,R.anim.left_out); 其中第一个参数为activity进入时的效果,具体效果可以自己实现。left_in:xml versi_android 页面跳转动画

C++积累06_简单的学生成绩管理系统_1.题目要求 学生成绩管理系统 (1)增加记录:要求可以连续增加多条记录。 (2)查找:-程序员宅基地

文章浏览阅读604次。这个学生成绩管理系统是我一个高中哥们他们的假期作业,记得假期的时候我刚看到了这个的最终效果,大一上刚结束的我震惊了:原来控制台还能这么玩儿!题目描述(1) 增加记录:要求可以连续增加多条记录。(2) 查找:可以根据姓名(或学号)查找某个学生的课程成绩,查找某门课程成绩 处于指定分数段内的学生名单等等。可以实现模糊查询,即输入名字的一部 分,可以列出满足条件的所有记录。再从这个记录中进行二次选..._1.题目要求 学生成绩管理系统 (1)增加记录:要求可以连续增加多条记录。 (2)查找:

python 字符串中包含{}时,如何format_python 字符串里带{}怎么用format-程序员宅基地

文章浏览阅读1.3k次。字符串含有{}字符时,format方法_python 字符串里带{}怎么用format

insert into插入数据_insert into `tjgxck`.`inv_nova_inv_mininv` (`id`, -程序员宅基地

文章浏览阅读3.8k次。insert into 表名称 values(值1,值2,...) 可以指定所要插入数据的列:INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)遇到了个自己都想不到的错误,我一定是没睡醒_insert into `tjgxck`.`inv_nova_inv_mininv` (`id`, `bizorgcode`, `createddate

自己封装一个文件上传函数(使用axios)-程序员宅基地

文章浏览阅读187次。  昨天在写博客的个人动态页面,里面涉及到了图片上传。  之前我都是用的别人的插件和elementUI的upload组件。但是现在没法用了。  页面的效果差别有点大,如果改elementUI的样式,会很累。  这时候很愁人啊。(懒啊!)  这是页面开发的效果,很像qq空间的感觉。  ...

排课系统算法_排课算法-程序员宅基地

文章浏览阅读1.4k次,点赞3次,收藏22次。业务上需要做一个排课系统,先调研了业内友商的排课系统,同时做了算法的对比和可行性分析。_排课算法

推荐文章

热门文章

相关标签