【蓝桥杯】 基础练习 数的读法

本文介绍了一种将超长数字转换为汉语拼音读法的系统设计,特别关注于中文读数规则,如零的处理和特定数字组合的正确发音。通过分析数字字符串的每一位,系统能够准确地将其转换为符合中文读数习惯的拼音形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
  TomTomTom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。
  比如说,在对学生讲解第123456700912345670091234567009号位置上的碱基时,光看着数字是很难准确的念出来的。
  所以,他迫切地需要一个系统,然后当他输入123456700912 3456 70091234567009时,会给出相应的念法:
  十二亿三千四百五十六万七千零九
  用汉语拼音表示为
  shishishi ererer yiyiyi sansansan qianqianqian sisisi baibaibai wuwuwu shishishi liuliuliu wanwanwan qiqiqi qianqianqian linglingling jiujiujiu
  这样他只需要照着念就可以了。
  你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。
  注意必须严格按照规范,比如说“10010”读作“yiyiyi wanwanwan linglingling yiyiyi shishishi”而不是“yiyiyi wanwanwan linglingling shishishi”,“100000”读作“shishishi wanwanwan”而不是“yiyiyi shishishi wanwanwan”,“2000”读作“ererer qianqianqian”而不是“liangliangliang qianqianqian”。
输入格式
  有一个数字串,数值大小不超过2,000,000,0002,000,000,0002,000,000,000
输出格式
  是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。
样例输入
123456700912345670091234567009
样例输出
shishishi ererer yiyiyi sansansan qianqianqian sisisi baibaibai wuwuwu shishishi liuliuliu wanwanwan qiqiqi qianqianqian linglingling jiujiujiu

个人思路:将输入的数字看成一个字符串,然后对其每一位处理。这道题目的难点在于对于当前位为0时需要进行特殊处理,还有就是对于“shishishi”的判断,比如10、100000等,这种情况就不能输出"yiyiyi",而是应该输出"shishishi"

#include<iostream>
#include<string>
#include<algorithm>
using namespace std; 
int main()
{
	string digits[10] = {"", "shi", "bai", "qian", "wan", "shi", "bai", "qian", "yi", "shi"};
	string number[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
	string str;
	cin >> str;
	
	int len = str.length();
	for(int i = 0; i < len; i++)
	{
		int num = str[i] - '0';   //得到每一位
		int nowdig = len - i - 1;	 //剩余位数
		//对0的特殊处理
		if(num == 0)
		{	
			//每4位处理
			if((nowdig) % 4 == 0)	 
			{
				int count = min(i+1, 4);  //若不足4位则判断i+1位
				bool allzero = true;	
				//从每4位的末尾开始往前判断
				for(int j = 0; j < count ; j++)
				{
					if(str[i - j] != '0')
					{
						allzero = false;
						break;	
					}  
				}
				//如果全为0则继续
				if(allzero)
					continue;	
				//否则输出
				else
					cout << digits[nowdig] << " ";
			}
			//如果下一位不为0且存在,则输出
			if(i + 1 < len && str[i + 1] != '0')
				cout << number[num] << " ";
		}
		//对"shi"的处理
		else if(num == 1 && (nowdig == 1 || nowdig == 5 || nowdig == 9))
		{
			cout << digits[nowdig] << " ";
		}
		else
		{	
			cout << number[num] << " " << digits[nowdig] << " ";				
		}	
	}	
	cout << endl;
	return 0;
}
对于一个n,我们可以将其拆分成若干组位相同的字,然后读出每一组字的值和单位。例如: - 对于 123456789,我们可以将其拆分成 1 亿,2345 万,6789。 - 对于 200000,我们可以将其拆分成 2 十万。 具体的读法可以参考以下规则: - 对于 1~9 的字,直接读出其汉字,如 1 读作“一”,9 读作“九”。 - 对于 10~99 的字,读出十位的汉字,如果个位不为 0,则加上个位的汉字,如 22 读作“二十二”,55 读作“五十五”。 - 对于 100~999 的字,读出百位的汉字,如果十位为 0,则只读出“几百”,否则在“几百”后加上十位和个位的汉字,如 234 读作“二百三十四”,707 读作“七百零七”。 - 对于 1000~9999 的字,读出千位的汉字,如果百位为 0,则只读出“几千”,否则在“几千”后加上百位、十位和个位的汉字,如 5678 读作“五千六百七十八”。 - 对于 10000~99999 的字,读出万位的汉字,如果千位为 0,则只读出“几万”,否则在“几万”后加上千位、百位、十位和个位的汉字,如 12345 读作“一万二千三百四十五”。 - 对于 100000~999999 的字,读出十万位的汉字,如果万位为 0,则只读出“几十万”,否则在“几十万”后加上万位、千位、百位、十位和个位的汉字,如 234567 读作“二十三万四千五百六十七”。 - 对于 1000000~99999999 的字,读出百万位的汉字,如果十万位为 0,则只读出“几百万”,否则在“几百万”后加上十万位、万位、千位、百位、十位和个位的汉字,如 12345678 读作“一千二百三十四万五千六百七十八”。 - 对于 100000000~999999999 的字,读出亿位的汉字,如果百万位为 0,则只读出“几亿”,否则在“几亿”后加上百万位、十万位、万位、千位、百位、十位和个位的汉字,如 987654321 读作“九亿八千七百六十五万四千三百二十一”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值