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

该代码实现了一个系统,将阿拉伯数字转换为汉语拼音读法,尤其适用于大数字在基因课程中的读取。程序通过处理数字的每一位,结合不同位数的单位,生成对应的汉语拼音字符串。例如,1234567009转换为shieryisanqiansibaiwushiliuwanqiqianlingjiu。
摘要由CSDN通过智能技术生成

试题 基础练习 数的读法

资源限制

内存限制:512.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

  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

对于该题我将分析写在代码中了,请观看下方代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string a[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};//用数组a存储0~9的拼音读法。string 字符串名[],该种情况只能用在声明同时赋值的情况下
	string b[]={"","","shi","bai","qian","wan","shi","bai","qian","yi","shi","bai"};//用数组b存储12位每一位上的单位,一个数中不存在0位,所以第一个字符为空,且个位上无个这个单位,所以第二个字符也为空
	string s;//接下来我们用s来记录用户输入的字符串
	string s1[1000];//用数组s1存储每一个数字或一串0的读法(字符串可以直接使用加号拼接)
	int z=0;//z作为s1的下标
	cin>>s;
	int l=s.length();//记录下此时用户输入的字符串的长度以确认输入的数总共有多少位
	for(int i=l-1;i>=0;i--)//接下来我们开始输出转换后的数字
	{
		int num=s[i]-'0';//定义num用于获取每一位位子上的数字,位数从右到左(字符数组中每一元素存储为ascll码值,且连续的字母或数字,ascll码值相差1,所以可以用字符减去这段连续的字母或数字的首位字符,以获得二者的距离(ascll码值的差值))
		/*在0~9的这串数字中0和1最特殊,所以对二者分开讨论*/
		if(num==0)//首先我们讨论为0时
		{	//我们知道一般一个数以每4个数字进行分层,如1212345678,可分为12 / 1234 / 5678,三个层次,且他们仅有每层最右边的单位不同,
			if(l-i==1 || l-i==5 || l-i==9)//如果每层最右边一位为0时,那么在这前面连续的0均不用读出,直到遇见一个不为0的数字,且仅限于该层中
			{
				i--;//刚刚读出的数已经为0,所以我们直接向前读一位
				while(s[i]=='0' && (l-i-1)%4!=0)//此时我们就需要找到该层次中不为0的数
				{
					i--;
				}
				i++;//结束上方循环后重新校验这个位置的数
				continue;
			}
			s1[z++]=a[num];//当上述判断不满足时,则直接输出ling ,因为只要不满足上述判断,无论多少个0都需要输出0,如1001读作yi qian ling yi只读其中一个零
			while(s[i-1]=='0')
			{
				i--;
			}
		}
		else if(num==1 && ((l-2)%4)==0 && i==0)//根据题目意思得第一位数字为1时,且位于每个层次的十位时,不能输出yi
		{
				s1[z++]=b[l-i];
		}
		else//如果均不是上述2种特殊情况,则直接输出数字及单位
		{
			
			s1[z++]=a[num]+" "+b[l-i];
		}
	}
	for(int i=z-1;i>=0;i--)//最后输出结果,由于前面我们是倒着读入,所以此时我们需要倒着读出
	{
		cout<<s1[i]<<" ";
	}
	return 0;
}

这道题我看了许多别人的代码觉的大家都各有各的特点,所以我也想另辟蹊径,写下了上面的代码,如果不好勿喷。

欢迎大家留言评论,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值