描述
Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:
具体规则如下:
1.在英语读法中三位数字看成一整体,后面再加一个计数单位。从最右边往左数,三位一单位,例如12,345 等
2.每三位数后记得带上计数单位 分别是thousand, million, billion.
3.公式:百万以下千以上的数 X thousand X, 10亿以下百万以上的数:X million X thousand X, 10 亿以上的数:X billion X million X thousand X. 每个X分别代表三位数或两位数或一位数。
4.在英式英语中百位数和十位数之间要加and,美式英语中则会省略,我们这个题目采用加上and,百分位为零的话,这道题目我们省略and
下面再看几个数字例句:
22: twenty two
100: one hundred
145: one hundred and forty five
1,234: one thousand two hundred and thirty four
8,088: eight thousand (and) eighty eight (注:这个and可加可不加,这个题目我们选择不加)
486,669: four hundred and eighty six thousand six hundred and sixty nine
1,652,510: one million six hundred and fifty two thousand five hundred and ten
说明:
数字为正整数,不考虑小数,转化结果为英文小写;
保证输入的数据合法
关键字提示:and,billion,million,thousand,hundred。
数据范围:1≤n≤2000000
输入描述:
输入一个long型整数
输出描述:
输出相应的英文写法
示例1
输入:
22
输出:
twenty two
#include<cstdio>
#include<string>
#include<vector>
#include<map>
using namespace std;
map<int,string> myMap={
{0,"zero"}, {1,"one"}, {2,"two"}, {3,"three"},
{4,"four"}, {5,"five"}, {6,"six"}, {7,"seven"},
{8,"eight"}, {9,"nine"}, {10,"ten"}, {11,"eleven"},
{12,"twelve"}, {13,"thirteen"}, {14,"fourteen"}, {15,"fifteen"},
{16,"sixteen"}, {17,"seventeen"}, {18,"eighteen"}, {19,"nineteen"},
{20,"twenty"}, {30,"thirty"}, {40,"forty"}, {50,"fifty"},
{60,"sixty"}, {70,"seventy"}, {80,"eighty"}, {90,"ninety"},
{100,"hundred"},{1000,"thousand"},{1000000,"million"},{1000000000,"billion"}
};
string transf(int n)
{
string num="";
// 20以内的数
if(n>=0 && n<=20)
{
num=myMap[n];
}
// 20以上的2位数
else if(n>20 && n<100)
{
// 如果是整十
if(n%10==0)
{
num=myMap[n];
}
//非整十
else {
num=myMap[(n/10)*10]+" "+myMap[n%10];
}
}
// 3位数
else if(n>=100 && n<1000)
{
// 如果是整百
if(n%100==0)
{
num=myMap[n/100]+" "+myMap[100];
}
// 非整百
else
{
// 低2位数在20以内
if(n%100>0 && n%100<=20)
{
num=myMap[n/100]+" "+myMap[100]+" "+"and"+" "+myMap[n%100];
}
// 低两位超过20
else
{ //低两位整十
if(n%10==0)
{
num=myMap[n/100]+" "+myMap[100]+" "+"and"+" "+myMap[n%100];
}
//低两位非整十
else {
num=myMap[n/100]+" "+myMap[100]+" "+"and"+" "+myMap[((n%100)/10)*10]+" "+myMap[n%10];
}
}
}
}
return num;
}
int main()
{
// 1.输入
long long num;
scanf("%lld",&num);
// 2.把数字划按3位划分,低位 --> 高位
int i=0;
int temp=0;
vector<int> vec;
//小于3位数
if(num<1000)
{
vec.push_back(num);
}
// 超过3位数
else {
while (num) {
if(i==3)
{
vec.push_back(temp);
i=0;
temp=0;
if(num<1000) //最后少于3位数
{
vec.push_back(num);
break;
}
}
int r=1;
for(int j=0;j<i;j++)
{
r*=10;
}
temp+=(num%10)*r;
num/=10;
i++;
}
}
/*
千: thousand 1,000
百万:million 1,000,000
十亿:billion 1,000,000,000
*/
// 3.转换
vector<string> result;//存储转换结果
string str="";
for(int i=0;i<vec.size();i++) //低位-<高位
{
if(i==3)
{
str=transf(vec[i])+" "+myMap[1000000000];
}
if(i==2)
{
str=transf(vec[i])+" "+myMap[1000000];
}
if(i==1)
{
str=transf(vec[i])+" "+myMap[1000];
}
if(i==0)
{
str=transf(vec[i]);
}
result.push_back(str);
}
// 4.输出
for(int i=result.size()-1;i>=0;i--)
{
printf("%s ",result[i].c_str());
}
}