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

问题描述

  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。

输出格式

  是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。

这道题对字符的拼接能力很是考验,这道题让我想起了报时助手的那道题主要就是对字符完成拼接,代码如下:

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String strNumber = sc.next();
        String[] number = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};//从0至9
        String[] lingNumber = {"0000", "000", "00", "0"};//注意相应位置
        int n = (strNumber.length()) % 4;//用来获得补几位0
        strNumber = lingNumber[n] + strNumber;//补为4的倍数
        int nZero = 0;
        String result = "";
        for (int i = 4 - n; i < strNumber.length(); i++) {//从第一位不为0的位开始for循环
            if (strNumber.charAt(i) != '0') {//判断当前遍历的元素是否为0
                if (nZero > 0 && i % 4 != 0) {//用连续的0,且并不是一个组的第一个位置
                    result += "ling ";
                }
                nZero = 0;//加0之后立即重新计数
                if (i % 4 == 0) {//位于万位上的千位,个位上的千位
                    result += number[strNumber.charAt(i) - '0'] + " qian ";
                } else if (i % 4 == 1) {//百位
                    result += number[strNumber.charAt(i) - '0'] + " bai ";
                } else if (i % 4 == 2) {//十位
                    result += number[strNumber.charAt(i) - '0'] + " shi ";
                } else {//个位
                    result += number[strNumber.charAt(i) - '0'];
                }
            } else nZero++;//遇到0赶紧进行记录
            if ((strNumber.length() - i) % 5 == 0 && nZero < 4) {//位于万位上且这一整组不全为0才能加万
                result += " wan ";
            }
            if ((strNumber.length() - i) % 9 == 0) {//位于亿位上时
                result += " yi ";
            }
        }
        if (result.indexOf("yi shi") == 0) {//对yi shi开头的进行分割
            result = result.substring(3, result.length());
        }
        System.out.println(result);
    }
}

首先我们对输入的数字进行标准化,将其化为4的整数倍利于我们进行操作,接着就是对连续0的情况的处理,在声明0至9的数组时也是有技巧的,切不可无序进行排列,每读取一个数字时都要对是否加上万位,亿位进行判断,最后就是对题设中的“yi shi”特殊情况的处理。

加油!!!

奥利给!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值