哈哈挺开心的, 写了个数转换数的读法的读法的题, 写了两个小时看看吧 顺便给点个赞啊❤️
数的读法
题目描述
Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。所以,他迫切地需要一个系统,然后当他输入123456 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”。
输入格式
有一个数字串,长度不超过12。
输出格式
是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。
样例 #1
样例输入 #1
1234567009
样例输出 #1
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
// Problem: T350753 数的读法
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/T350753
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
string num_to_spell(int num)
{
if (!num) return "ling";
if (num == 1) return "yi";
if (num == 2) return "er";
if (num == 3) return "san";
if (num == 4) return "si";
if (num == 5) return "wu";
if (num == 6) return "liu";
if (num == 7) return "qi";
if (num == 8) return "ba";
return "jiu";
}
string digit_to_spell(int num)
{
if (num < 1) return "";
if (num == 1) return "wan";
return "yi";
}
string to_spell(int len)
{
if (len == 2) return "shi";
if (len == 3) return "bai";
return "qian";
}
int to_num(char x)
{
return x - '0';
}
bool last_zero(int len, string s)
{
reverse(s.begin(), s.end());
for (int i = 0; i < len; i++)
if (s[i] != '0') return true;
return false;
}
string do_part(int cnt, string str)
{
int len = str.size();
string s;
char pre = ' ';
for (auto j : str)
{
if (j != '0' || j != pre)
{
if ((j != '1' || len != 2) && last_zero(len, str))
s += num_to_spell(to_num(j)) + " ";
if (j != '0' && len > 1)
s += to_spell(len) + " ";
}
pre = j;
len--;
}
s += digit_to_spell(cnt) + " ";
return s;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// freopen("T350753.in", "r", stdin);
// freopen("T350753.out", "w", stdout);
string s;
cin >> s;
if (s == "0") cout << "ling";
else
{
reverse(s.begin(), s.end());
int s_size = s.size();
stack<string> stk;
vector<string> g;
string str;
for (int i = 0; i < s_size; i++)
{
str += s[i];
if ((i + 1) % 4 == 0)
{
reverse(str.begin(), str.end());
g.push_back(str);
str = "";
}
}
reverse(str.begin(), str.end());
if (s_size % 4) g.push_back(str);
int cnt = 0;
for (auto i : g)
{
stk.push(do_part(cnt, i));
cnt++;
}
while (stk.size())
{
cout << stk.top();
stk.pop();
}
}
return 0;
}
// 128m