1082 Read Number in Chinese (25 分)
思路
这道字符串算是比较难了,恰烂分代码12分
#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]);
}
参考算法笔记,分组进行精细的讨论。
代码虽然满分,但是有个bug,开头为0的数字没有考虑,这种输入输出明显不合理。但好像也不必考虑,只考虑为0的情况即可。
001
ling Bai ling yi
代码
#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;
}
}