题目:输入一个小于1万亿的正整数,输出这个正整数的读法的拼音表示。
如,输入:1234,输出:yiqianerbaisanshisi
输入:1234567,输出:yibaiershisanwansiqianwubailiushiqi
注意:2不读做liang,而读作er。
下面有两种coding版本,第一种较粗暴,是一个字符一个字符的处理,代码量很大。第二种用map存储一下对应为的后缀,代码量小一点。并且注意:第一种coding方法没有处理123004这种中间有两个零的情况(可以加点代码就能把这种情况考虑到,懒得加了),而第二种情况处理了这种情况。
第一种方法:每四位一组,读最高四位后(假如高四位不为空),后跟yi,接着读中间四位(假如中间四位不为空),后跟wan,接着读最低四位。第一种方法虽然coding量比较大,但思路也是非常简单。
代码如下:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
char source[20]="";
char yi[5]="";
char wan[5]="";
char ge[5]="";
char destination[10000];
int i=0;
scanf("%s",source);
int len=strlen(source);
if(len<5)
{
for(i=0;i<len;i++)
ge[i]=source[i];
ge[i]='\0';
}
else if(len<9)
{
int j=0;
for(i=len-4;i<len;i++,j++)
ge[j]=source[i];
ge[j]='\0';
j=0;
for(i=0;i<len-4;i++,j++)
{
wan[j]=source[i];
}
wan[j]='\0';
}
else
{
int j=0;
for(i=len-4;i<len;i++,j++)
ge[j]=source[i];
ge[j]='\0';
j=0;
for(i=len-8;i<len-4;i++,j++)
{
wan[j]=source[i];
}
wan[j]='\0';
j=0;
for(i=0;i<len-8;i++,j++)
{
yi[j]=source[i];
}
yi[j]='\0';
}
i=0;
if(strlen(yi)!=0)
{
int k=0;
for(int yii=0;yii<strlen(yi);yii++)
{
switch(yi[yii])
{
case '1':
destination[i++]='y';
destination[i++]='i';
switch(strlen(yi)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '2':
destination[i++]='e';
destination[i++]='r';
switch(strlen(yi)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '3':
destination[i++]='s';
destination[i++]='a';
destination[i++]='n';
switch(strlen(yi)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '4':
destination[i++]='s';
destination[i++]='i';
switch(strlen(yi)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '5':
destination[i++]='w';
destination[i++]='u';
switch(strlen(yi)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '6':
destination[i++]='l';
destination[i++]='i';
destination[i++]='u';
switch(strlen(yi)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '7':
destination[i++]='q';
destination[i++]='i';
switch(strlen(yi)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '8':
destination[i++]='b';
destination[i++]='a';
switch(strlen(yi)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '9':
destination[i++]='q';
destination[i++]='i';
destination[i++]='u';
switch(strlen(yi)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '0':
destination[i++]='l';
destination[i++]='i';
destination[i++]='n';
destination[i++]='g';
k++;
break;
}
}
destination[i++]='y';
destination[i++]='i';
}
if(strlen(wan)!=0)
{
int k=0;
for(int wani=0;wani<strlen(wan);wani++)
{
switch(wan[wani])
{
case '1':
destination[i++]='y';
destination[i++]='i';
switch(strlen(wan)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '2':
destination[i++]='e';
destination[i++]='r';
switch(strlen(wan)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '3':
destination[i++]='s';
destination[i++]='a';
destination[i++]='n';
switch(strlen(wan)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '4':
destination[i++]='s';
destination[i++]='i';
switch(strlen(wan)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '5':
destination[i++]='w';
destination[i++]='u';
switch(strlen(wan)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '6':
destination[i++]='l';
destination[i++]='i';
destination[i++]='u';
switch(strlen(wan)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '7':
destination[i++]='q';
destination[i++]='i';
switch(strlen(wan)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '8':
destination[i++]='b';
destination[i++]='a';
switch(strlen(wan)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '9':
destination[i++]='q';
destination[i++]='i';
destination[i++]='u';
switch(strlen(wan)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '0':
destination[i++]='l';
destination[i++]='i';
destination[i++]='n';
destination[i++]='g';
k++;
break;
}
}
destination[i++]='w';
destination[i++]='a';
destination[i++]='n';
}
if(strlen(ge)!=0)
{
int k=0;
for(int gei=0;gei<strlen(ge);gei++)
{
switch(ge[gei])
{
case '1':
destination[i++]='y';
destination[i++]='i';
switch(strlen(ge)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '2':
destination[i++]='e';
destination[i++]='r';
switch(strlen(ge)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '3':
destination[i++]='s';
destination[i++]='a';
destination[i++]='n';
switch(strlen(ge)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '4':
destination[i++]='s';
destination[i++]='i';
switch(strlen(ge)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '5':
destination[i++]='w';
destination[i++]='u';
switch(strlen(ge)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '6':
destination[i++]='l';
destination[i++]='i';
destination[i++]='u';
switch(strlen(ge)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '7':
destination[i++]='q';
destination[i++]='i';
switch(strlen(ge)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '8':
destination[i++]='b';
destination[i++]='a';
switch(strlen(ge)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '9':
destination[i++]='q';
destination[i++]='i';
destination[i++]='u';
switch(strlen(ge)-k)
{
case 4:
destination[i++]='q';
destination[i++]='i';
destination[i++]='a';
destination[i++]='n';
break;
case 3:
destination[i++]='b';
destination[i++]='a';
destination[i++]='i';
break;
case 2:
destination[i++]='s';
destination[i++]='h';
destination[i++]='i';
break;
}
k++;
break;
case '0':
destination[i++]='l';
destination[i++]='i';
destination[i++]='n';
destination[i++]='g';
k++;
break;
}
}
}
destination[i]='\0';
cout<<destination<<endl;
return 0;
}
第二种方法:用map<int,string>存储对应位的后缀是什么,其中int是这个位的索引(第几位),string表示对应的后缀,如第2为对应“shi”、第5位对应"wan"等。其实可以再用map<char,string>表示对应字符的拼音表示,如‘0’对应“ling”、'1'对应"yi"等,这里用了switch的方法,不是最优。代码如下:
#include<iostream>
#include<map>
using namespace std;
int main()
{
char source[20];
char result[1000]="";
cin>>source;
map<int,string> suffix;
map<int,int> suffix_len;
suffix[2]="shi";
suffix_len[2]=3;
suffix[3]="bai";
suffix_len[3]=3;
suffix[4]="qian";
suffix_len[4]=4;
suffix[5]="wan";
suffix_len[5]=3;
suffix[6]="shi";
suffix_len[6]=3;
suffix[7]="bai";
suffix_len[7]=3;
suffix[8]="qian";
suffix_len[8]=4;
suffix[9]="yi";
suffix_len[9]=2;
suffix[10]="shi";
suffix_len[10]=3;
suffix[11]="bai";
suffix_len[11]=3;
suffix[12]="qian";
suffix_len[12]=4;
int len=strlen(source);
int result_index=0;
for(int i=len-1;i>=0;i--)
{
switch(source[len-1-i])
{
case '1':
strcat(result+result_index,"yi");
result_index+=2;
break;
case '2':
strcat(result+result_index,"er");
result_index+=2;
break;
case '3':
strcat(result+result_index,"san");
result_index+=3;
break;
case '4':
strcat(result+result_index,"si");
result_index+=2;
break;
case '5':
strcat(result+result_index,"wu");
result_index+=2;
break;
case '6':
strcat(result+result_index,"liu");
result_index+=3;
break;
case '7':
strcat(result+result_index,"qi");
result_index+=2;
break;
case '8':
strcat(result+result_index,"ba");
result_index+=2;
break;
case '9':
strcat(result+result_index,"jiu");
result_index+=3;
break;
}
if(source[len-1-i]=='0')
{
int j;
for(j=len-1-i+1;j<(len-1-(((i+1)/4)*4-1));j++)
{
if(source[j]!='0')
break;
}
if(j==(len-1-(((i+1)/4)*4-1)))
{
i=((i+1)/4)*4-1;
strcat(result+result_index,suffix[i+2].c_str());
result_index+=suffix_len[i+2];
continue;
}
else
{
strcat(result+result_index,"ling");
result_index+=4;
i=len-1-j+1;
continue;
}
}
strcat(result+result_index,suffix[i+1].c_str());
result_index+=suffix_len[i+1];
}
result[result_index]='\0';
cout<<result<<endl;
return 0;
}