U624127 教教我们!东雪莲学姐!
题目背景
原题:CatOJ 【0713 初2023B】教教我们!东雪莲学姐!
题面来自 @Sharkat_Star,如有问题请私信解决。
如果需要这道题的标程或题解,请私信 @Sharkat_Star,她会马上去写。
题目描述
> 作为一名熟练掌握中日英三门语言的不太常见的虚拟主播,东雪莲每天都会被很多人问外语问题。今
天,他们给出很多数字,问这些数字在外语里怎么读。对于她,用外语念出这些数字轻而易举,但是
数字的个数实在太多了,所以她想让你编写一个程序,回答这些粉丝的问题。
你需要编写一个程序,实现输入一个不大于 $10^{12}$ 的非负整数后,用英语或日语写出这个数字。
**英语(省略所有and,在美式英语允许的范围内)写数字的规则如下:**
**$0$ 到 $9$ 的写法:**
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| zero | one | two | three | four | five | six | seven | eight | nine |
**两位数的写法:**
+ 对于小于$19$ 的两位数:
| 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| ten | eleven | twelve | thirteen | fourteen | fifteen | sixteen | seeventeen | eighteen | nineteen |
+ 对于除 $10$ 外 $10$ 的倍数:
| 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| twenty | thirty | forty | fifty | sixty | seventy | eighty | ninety |
**对于其他两位数:**
先写出去掉个位数后构成的10的倍数,再写个位数,两者之间用连字符 `-` 连接
例如 $67$ 写作 `sixty-seven`,$23$ 写作`twenty-three`。
**三位数的写法:**
+ 对于 $100$ 的倍数:
取出百位数,参照 $1$ 到 $9$ 的写法写出,再加 `hundred`,两者之间以一个空格隔开
例如 $400$ 写作 `four hundred`。
+ 对于其他的三位数:
先写出去掉十位、个位后构成的 $100$ 的倍数,再写出十位、个位构成的两位数(若十位为 $0$ 则写出个位
数),两者之间以一个空格隔开
例如 $234$ 写作 `two hundred thirty-four`,$204$ 写作 `two hundred four`。
**大于三位的数字的写法:**
大于三位的数字需要借助数量单位写出,英语中的数量单位写法如下:
| $10^3$ | $10^6$ | $10^9$ |
|:-:|:-:|:-:|
| thousand | million | billion |
在三位数后加上数量单位(两者之间以一个空格隔开),可以使该三位数的值扩大相应倍数。
例如 $1$ 写作 `one`,则 `one thousand` 表示 $1000$;$123$ 写作 `one hundred twenty-three`,则`one hundred twenty-three thousand` 表示 $123000$。
在写大于三位的数字时,先将其从低位到高位三位一组划分成若干个位数不超过三位的部分,再按照从高位到低位的顺序写出每个非零部分并加上相应数量单位。
例如:
$1234567890$,三位一组划分后为:$1,234,567,890$:
| 划分后的部分 | 写法 | 数量单位 |
|:-:|:-:|:-:|
| $1$ | one | billion |
| $234$ | two hundred thirty-four | million |
| $567$ | five hundred sixty-seven | thousand |
| $890$ | eight hundred ninety | 无 |
各部分连起来,写作 `one billion two hundred thirty-four million five hundred sixty-seven thousand
eight hundred ninety`。
$1230000890$,三位一组划分后为:$1,230,000,890$,读作 `one billion two hundred thirty million eight
hundred ninety`。
**日语中的数字写法如下:**
**$0$ 到 $9$ 的写法:**
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| zero | ichi | ni | san | yon | go | roku | nana | hachi | kyuu |
**四位数的写法:**
四位数数字需要借助三个数量单位写出,写法如下:
| 10 | 100 | 1000 |
|:-:|:-:|:-:|
| juu | hyaku | sen |
在一位数($2$ 到 $9$ 之间,不包括 $1$)后直接加上上述三种数量单位中的一种(无间隔),可以使该一位数的值扩大相应倍数。
例如 $7$ 写作 `nana`,则 `nanahyaku` 表示 $700$。
特殊地,由于音便,下面列举的 $5$个数字 + 数量单位的组合不遵守上述规则:
| $300$ | $600$ | $800$ | $3000$ | $8000$ |
|:-:|:-:|:-:|:-:|:-:|
| san**by**aku | ro**ppya**ku | ha**ppya**ku | san**ze**n | ha**sse**n |
在写四位数时,从高到底一位一位地写出所有非零位,每一位的数字后面加上相应的数量单位(除个位外)。
例如 $2345$,从高到底的每一位分别为 $2,3,4,5$:
| 每一位 | 写法 | 数量单位 | 组合后 |
|:-:|:-:|:-:|:-:|
| $2$ | ni | sen | nisen |
| $3$ | san | hyaku | sanbyaku |
| $4$ | yon | juu | yonjuu |
| $5$ | go | / | go |
各部分连起来,写作 `nisensanbyakuyonjuugo`。
若 $1$ 位于该四位数的千位、百位或十位,则 $1$ 不必写出,只需写出相应的数量单位即可。
例如:$1111$ 写作 `senhyakujuuichi`,而不是 `ichisenichihyakuichijuuichi`。
**大于四位数字的写法:**
大于四位的数字需要借助另外两种数量单位写出,写法如下:
| $10^4$ | $10^8$ |
|:-:|:-:|
| man | oku |
在四位数后直接加上上述两种数量单位的一种(无间隔),可以使该四位数的值扩大相应倍数。
例如:
$1$ 写作 `ichi`,则 `ichiman` 表示 $10000$;$1234$ 写作 `sennihyakusanjuuyon`,则 `sennihyakusanjuuyonman` 表示 $12340000$。
在写大于四位的数字时,从低位到高位四位一组划分成若干个四位数,按照从高位到低位的顺序写出每个四位数并加上相应数量单位。
例如:
$1234567890$,四位一组划分后为:$12,3456,7890$。
| 划分后的部分 | 写法 | 数量单位 |
|:-:|:-:|:-:|
| $12$ | juuni | oku |
| $3456$ | san**ze**nyonhyakugojuuroku | man |
| $7890$ | nanasenha**ppya**kukyuujuu | 无 |
各部分连起来,写作 `juuniokusanzenyonhyakugojuurokumannanasenhappyakukyuujuu`。
特殊地,当在 $1000$ 后加数量单位 `man` 时,$1000$ 写作 `issen` 而不是 `sen`;当 `man` 加在其他四位数之后时无此现象。
例如:
$100010001000$ 写作 `senokuissenmansen`,而不是 `senokusenmansen`。
$11001100$ 写作 `senhyakumansenhyaku`。
输入格式
第一行输入一个整数 $T$ 和一个大写字母 $M$,两者之间以一个空格隔开。其中,$T$ 表示询问的次数,$M$ 则代表目标语言。
接下来 $T$ 行,每行一个正整数 $a_i$,表示一次询问。
输出格式
对于每次询问,输出一行字符串,表示该次询问的数字在目标语言的写法。
若大写字母 $M='E'$,则目标语言为英语;若大写字母 $M='J'$,则目标语言为日语。
说明/提示
对于 $100\%$ 的数据,保证 $1\le T\le 10^5,0\le a_i\le 10^{12},M\in \{'E','J'\}$。
数据未加入。