1082 Read Number in Chinese (25 分)
Ideas
This string is a bit more difficult, and the code is 12 points.
#include <bits/stdc++.h>
using namespace std;
int main()
{
char name[10][10]={
"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string str;
cin>>str;
int len = str.length();
int len2 =len;
int start = 0;
if(str[0]=='-')
{
cout<<"Fu ";
start +=1 ;
len2-=1;
}
if(len2>8)
printf("%s Yi %s Qian %s Bai %s Shi %s Wan %s Qian %s Bai %s Shi %s",name[int(str[start])-48],name[int(str[start+1])-48],name[int(str[start+2])-48],name[int(str[start+3])-48],name[int(str[start+4])-48],name[int(str[start+5])-48],name[int(str[start+6])-48],name[int(str[start+7])-48],name[int(str[start+8])-48]);
else if(len2==8)
printf("%s Qian %s Bai %s Shi %s Wan %s Qian %s Bai %s Shi %s",name[int(str[start])-48],name[int(str[start+1])-48],name[int(str[start+2])-48],name[int(str[start+3])-48],name[int(str[start+4])-48],name[int(str[start+5])-48],name[int(str[start+6])-48],name[int(str[start+7])-48]);
else if(len2==7)
printf("%s Bai %s Shi %s Wan %s Qian %s Bai %s Shi %s",name[int(str[start])-48],name[int(str[start+1])-48],name[int(str[start+2])-48],name[int(str[start+3])-48],name[int(str[start+4])-48],name[int(str[start+5])-48],name[int(str[start+6])-48]);
else if(len2==6)
printf("%s Shi %s Wan %s Qian %s Bai %s Shi %s",name[int(str[start])-48],name[int(str[start+1])-48],name[int(str[start+2])-48],name[int(str[start+3])-48],name[int(str[start+4])-48],name[int(str[start+5])-48]);
else if(len2==5)
printf("%s Wan %s Qian %s Bai %s Shi %s",name[int(str[start])-48],name[int(str[start+1])-48],name[int(str[start+2])-48],name[int(str[start+3])-48],name[int(str[start+4])-48]);
else if(len2==4)
printf("%s Qian %s Bai %s Shi %s",name[int(str[start])-48],name[int(str[start+1])-48],name[int(str[start+2])-48],name[int(str[start+3])-48]);
else if(len2==3)
printf("%s Bai %s Shi %s",name[int(str[start])-48],name[int(str[start+1])-48],name[int(str[start+2])-48]);
else if(len2==2)
printf("%s Shi %s",name[int(str[start])-48],name[int(str[start+1])-48]);
else if(len2==1)
printf("%s",name[int(str[start])-48]);
}
Refer to the algorithm notes for detailed discussion in groups.
Although the code has a perfect score, there is a bug. The number at the beginning of 0 is not considered. This input and output is obviously unreasonable. But it doesn't seem to be considered, just consider the case of 0.
001
ling Bai ling yi
Code
#include <bits/stdc++.h>
using namespace std;
int main()
{
char name[10][10]={
"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char wei[5][5] = {
"Shi","Bai","Qian","Wan","Yi"};
string str;
cin>>str;
int len = str.length();
int right =len-1;
int left = 0;
if(str[0]=='-')
{
cout<<"Fu";
left +=1 ;
}
while(left+4 <= right)
right -=4;
while(left <len)
{
bool flag =false;
bool print = false;
while(left<=right)
{
if(left>0 && str[left]=='0') //很神奇,left>0没有就出错
flag = true;
else
{
if(flag == true)
{
printf(" ling");
flag = false;
}
if(left>0) printf(" ");
printf("%s",name[str[left]-48]);
print = true;
if(left != right)
printf(" %s",wei[right-left-1]);
}
left ++;
}
if(print == true && right!=len-1)
printf(" %s",wei[(len-right-1)/4 + 2]);
right +=4;
}
}