将数字转化成英语单词。
分析单词可以发现每1000之间是有规律的。
class Solution
{
public:
string numberToWords(int num)
{
if(num==0)
return "Zero";
string bases[]= {"","Thousand","Million","Billion"};
string a[]= {"","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"};
string b1[]= {"Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
string b2[]= {"","","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
int i=0;
vector<string> vec;
while(num)
{
int val=num%1000;
if(i!=0&&val!=0)
vec.push_back(bases[i]);
int z=val%10,y=val/10%10,x=val/100;
if(y==1)
vec.push_back(b1[z]);
else
{
if(z!=0)
vec.push_back(a[z]);
if(y!=0)
vec.push_back(b2[y]);
}
if(x!=0)
vec.push_back(string(a[x]+" Hundred"));
num/=1000;
++i;
}
string result;
for(int i=vec.size()-1; i>=0; --i)
{
if(i!=vec.size()-1)
result+=" ";
result+=vec[i];
}
return result;
}
};
同理也可以实现单词转int数字。
strtok是字符串切割神器。
class Solution
{
public:
int wordsToNumber(string words)
{
if(words.empty()||words=="Zero")
return 0;
char cwords[words.size()+1];
strcpy(cwords,words.c_str());
map<string,int> base{make_pair("Thousand",1000),make_pair("Million",1000000),make_pair("Billion",1000000000)};
map<string,int> num{make_pair("One",1),make_pair("Two",2),make_pair("Three",3),make_pair("Four",4),make_pair("Five",5),make_pair("Six",6),make_pair("Seven",7),make_pair("Eight",8),make_pair("Nine",9),make_pair("Ten",10),
make_pair("Eleven",11),make_pair("Twelve",12),make_pair("Thirteen",13),make_pair("Fourteen",14),make_pair("Fifteen",15),make_pair("Sixteen",16),
make_pair("Seventeen",17),make_pair("Eighteen",18),make_pair("Nineteen",19),make_pair("Twenty",20),make_pair("Thirty",30),make_pair("Forty",40),
make_pair("Fifty",50),make_pair("Sixty",60),make_pair("Seventy",70),make_pair("Eighty",80),make_pair("Ninety",90)};
int result=0;
int val=0;
char *p=strtok(cwords," ");
while(p!=NULL)
{
string word(p);
map<string,int>::iterator it;
if((it=base.find(word))!=base.end())
{
result+=val*it->second;
val=0;
}
else if((it=num.find(word))!=num.end())
{
val+=it->second;
}
else if(word=="Hundred")
val*=100;
p=strtok(NULL," ");
}
result+=val;
return result;
}
};