问题描述
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;
}