题目描述:

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

思路分析:

  1. 首先创建一个 split 方法,将输入的所有数字从后往前分割成四位一组
  2. 创建一个 f1( ) 方法,可以按照普通方式直接将数读出来
  3. 创建一个 f2( )方法,可以将所有的被分割过的四位数按照f1( )方法读出来后连接起来
  4. 创建一个deal ( )方法,对不合规范的读法进行修改。

一:

  • 将输入的字符串 str 分割成字符串数组 arr[ ] ,数组的长度为:

(1)if(str.length%4==0) ---->arr.length = str.length/4

(2)arr.length = str.length/4+1

  • 分割成的字符串数组arr[0] 为最前面的小于或等于四位的数;arr[arr.length-1]为最后面的四位数。

public static String[] splitS(String s) {//将数字字符串分割成新的字符串数组
        int group  = 0;
        if(s.length()%4==0) {
            group = s.length()/4;
        }else {
            group = s.length()/4+1;
        }
        String[] res = new String[group];
        for(int i=group-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;
    }//返回输入的字符串切割之后的数组

二:

  • 创建 f1( ) 方法时,要求可以将分割后的数读出来,可能由一位数的、两位的、三位的、四位的。并且要求是用普通方法,最后统一修改。(当然大佬们可以忽略我的文章)
  • 由于是用拼音表示,则0对应ling,创建类变量字符串数组

static String str[] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"},则

public static String f1(String s) {//能把一个四位数读出来
        
        String res = "";
        if(s.length()==1) {
            res =str[s.charAt(0)-48];
        }else if(s.length()==2) {
            res = str[s.charAt(0)-48]+" shi "+str[s.charAt(1)-48];
        }else if(s.length()==3) {
            res = str[s.charAt(0)-48]+" bai "+str[s.charAt(1)-48]+" shi "+str[s.charAt(2)-48];
        }else if(s.length()==4) {
            res = str[s.charAt(0)-48]+" qian "+str[s.charAt(1)-48]+" bai "+str[s.charAt(2)-48]+" shi "+str[s.charAt(3)-48];
        }
        return res;
    }

三:

  • 创建 f2( ) 方法,将所有的分割的字符串连接起来。
  • 判断:如果字符串数组长度为1,则所有的字符串连接起来仍为他本身;如果字符串数组长度为2,则中间用“wan”连接;如果长度为3,则用“yi”、“wan”连接。

public static String f2(String[] arr) {//能把读数连在一起
        String s = "";
        if(arr.length ==1) {
            s =  f1(arr[0]); 
        }else if(arr.length == 2) {
            s = f1(arr[0])+" wan "+f1(arr[1]);
        }else if(arr.length == 3) {
            s =  f1(arr[0])+" yi "+f1(arr[1])+" wan "+f1(arr[2]);
        }
        return s;
    }

四:

  • 当对四位数读数时:ling qian -->ling ;  ling bai -->ling ; ling shi --> ling ;  ling ling-->ling ;
  • 连接后的字符串开头为 yi shi 时,变为 shi
  • 结尾有 ling 时,省去空格+ling ,共5个字符
  • 对于“ling ling -->ling”,需要循环,只要还有ling ling ,则还需改变

public static String deal(String s) {//在所有数连接好之后开始处理非法字符
        s = s.replace("ling wan", "wan");
        s = s.replace("ling qian","ling");//开头为零
        s = s.replace("ling bai", "ling");
        s = s.replace("ling shi","ling");
        while(s.contains("ling ling")) {
            s = s.replace("ling ling", "ling");
        }
        if(s.endsWith("ling"))
            s = s.substring(0, s.length()-5);//因为最后为ling,不用读,删去时需要删空格+ling,共五个字符
        if(s.startsWith("yi shi")) {
            s = s.replace("yi shi", "shi");
        }
        return s;
    }

总代码如下:

package day2_28;import java.util.Scanner;public class Main1496true {static String str[] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};public static void main(String[] args) {Scanner sc = new Scanner(System.in);String s = sc.next();String[] arr = splitS(s);//分割后的新字符串String zongzifu = "";zongzifu = f2(arr);System.out.println(deal(zongzifu));}public static String[] splitS(String s) {//将数字字符串分割成新的字符串数组int group  = 0;if(s.length()%4==0) {group = s.length()/4;}else {group = s.length()/4+1;}String[] res = new String[group];for(int i=group-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;}//返回输入的字符串切割之后的数组public static String deal(String s) {//在所有数连接好之后开始处理非法字符s = s.replace("ling wan", "wan");s = s.replace("ling qian","ling");//开头为零s = s.replace("ling bai", "ling");s = s.replace("ling shi","ling");while(s.contains("ling ling")) {s = s.replace("ling ling", "ling");}if(s.endsWith("ling"))s = s.substring(0, s.length()-5);//因为最后为ling,不用读,删去时需要删空格+ling,共五个字符if(s.startsWith("yi shi")) {s = s.replace("yi shi", "shi");}return s;}public static String f1(String s) {//能把一个四位数读出来String res = "";if(s.length()==1) {res =str[s.charAt(0)-48];}else if(s.length()==2) {res = str[s.charAt(0)-48]+" shi "+str[s.charAt(1)-48];}else if(s.length()==3) {res = str[s.charAt(0)-48]+" bai "+str[s.charAt(1)-48]+" shi "+str[s.charAt(2)-48];}else if(s.length()==4) {res = str[s.charAt(0)-48]+" qian "+str[s.charAt(1)-48]+" bai "+str[s.charAt(2)-48]+" shi "+str[s.charAt(3)-48];}return res;}public static String f2(String[] arr) {//能把读数连在一起String s = "";if(arr.length ==1) {s =  f1(arr[0]); }else if(arr.length == 2) {s = f1(arr[0])+" wan "+f1(arr[1]);}else if(arr.length == 3) {s =  f1(arr[0])+" yi "+f1(arr[1])+" wan "+f1(arr[2]);}return s;}}

数的读法(详解) 蓝桥杯java相关推荐

  1. PCF8591详解(蓝桥杯单片机模块(IIC总线))

    文章目录 概述 特性 总体 框图 引脚 功能描述 寻址 控制字节 D/A转换 D/A转换过程 A/D转换 A/D转换过程 蓝桥杯部分 原理图部分 AD部分 DA部分 结束 概述 PCF8591是一款单 ...

  2. AT24C02详解(蓝桥杯单片机模块(IIC总线))

    文章目录 特性 描述 引脚描述: 存储组织: 设备操作(IIC) 设备地址 写操作 字节写: 页写入: 确认轮询: 读操作 确认轮询: 当前地址读取: 任意地址读: 连续顺序读: 蓝桥杯部分 特性 2 ...

  3. DS1302详解(蓝桥杯单片机模块)

    文章目录 特性 详细描述 命令字节 CE 数据输入 数据输出 突发模态 时钟\日期 时钟停止标志 写保护 时钟\日期突发模式 RAM突发模式 数据传输 蓝桥杯部分 输出 特性 实时时钟计算秒.分.小时 ...

  4. 2015年 第06届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  5. 2016年 第07届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  6. 2017年 第08届 蓝桥杯 Java B组 决赛真题详解及小结

    ​​​​​蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 ...

  7. 2018年 第09届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  8. 2019年 第10届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  9. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  10. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

最新文章

  1. 3个月300个VR“体验馆”?张近东这句大话靠谱么?
  2. 手把手教你撸一个简易的 webpack
  3. AI修复技术为何这么强?原来背后的技术是……
  4. 24小时删!看完这17个超牛逼大数据视频让你妥妥进大厂!(限时领)
  5. PHP银行卡信息基类大全
  6. oracle财务软件凭证打印,ORACLE财务软件简明操作文档.doc
  7. 2019春 总结作业
  8. R: ggplot2图片的布局排版
  9. LAN9252采用外部阻容复位的时候,RESET引脚一直为低的原因以及对应解决办法。
  10. H5播放B站源的flv视频
  11. FPGA数字信号处理(1)- AM调制的FPGA实现
  12. 安卓非微信内置浏览器中的网页调起微信支付的方案研究
  13. 如何安装计算机刻录程序,详解怎么用电脑刻录光盘
  14. OpenStack核心组件原理与应用之Glance
  15. C#语言实例源码系列-实现动态图标闪烁显示
  16. 大数据的4v特征、数据预处理
  17. 湛江C语言培训,湛江c语言编程学习,湛江学c语言编程报班,湛江学c语言编程自学好还是报班好...
  18. 操作必须使用一个可更新的查询问题
  19. moxa串口服务器网页访问失败,moxa串口服务器连接设置
  20. TIA Portal(博途)弹出安装重启窗口的解决方法

热门文章

  1. Siemens_NX2306.1700_20230618(免安装)
  2. 计算机毕业设计springboot新能源汽车产业链分析系统q997c9[附源码]
  3. JavaWeb应用开发------校园二手平台
  4. C++程序设计:股票的最大波动
  5. 【Linux】初窥Linux 之 我最常用的20条命令
  6. element-ui表单input输入框获取自动聚焦功能
  7. 如何用Python制作一个动态爱心效果
  8. 哈工大计算机系统-这不是小作业,也就中等作业吧
  9. sql语句中BEGIN TRAN...COMMIT TRAN
  10. 毕设文案 赠源码28265-django 电子档管理系统