先把最常见的情况写出来,不断在中间加上一些判断条件就可以了。
分享一些测试数据:
0
ling
8
ba
808080808
ba Yi ling ba Bai ling ba Wan ling ba Bai ling ba
-880808080
Fu ba Yi ba Qian ling ba Shi Wan ba Qian ling ba Shi
800000008
ba Yi ling ba
800000000
ba Yi
80000008
ba Qian Wan ling ba
80008000
ba Qian Wan ba Qian
80000000
ba Qian Wan
接下来赋上已Ac代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
char ch [10][10] = {"","Shi","Bai","Qian","Wan","Shi","Bai","Qian","Yi"};//9
char nuch [11][10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu","shi"};
char c[11];
scanf("%s",c);
int len = strlen(c);//用来输出nuch中的值
int reality = len;//用来输出ch的值
int i = 0;
if(c[i] == '-'){//判断是否为负数
printf("Fu ");
i ++;
reality --;//要与ch中输出位一致
}else{//将整数向后移动一位,相当于前面加了一个‘+’号
for(int j = len;j > 0;j --){
c[j] = c[j - 1];
}
i ++;
len ++;//长度增加一
}
int space = 0;//因为该题控制了空格,当每次输出后应加上一个空格
int ling = 0;//如果有零那么加一,等到再一次输出时,应该优先输出'ling'再输出相应的数字,并且输出完'ling'后,记得将其清零,因为它已经用完了。
for(;i < len - 1;i ++){
if(c[i] == '0'&&reality - i != 4&&reality - i != 8){//碰上'0'就循环,碰上'Yi'和'Wan'即使为'0'也不能用该功能处理。
ling ++;
continue;
}else
if((reality - i == 4||reality - i == 8)&&c[i] == '0'&&ling != 3){//碰上'Yi'和'Wan'并且,ling的个数不能等于三个,因为等于三个相当于,本位为零
//并且前三位也为零,说明该四位为零,没必要输出'Wan'。
if(space != 0){
space --;
printf(" ");
}
printf("%s",ch[reality - i]);
ling = 0;
//cout<<ling<<endl;
space++;
}else if(ling!=3&&c[i]!= '0'){//说明四位都为ling,不需要输出
if(space != 0){
space --;
printf(" ");
}//此处是怕下一步要输出ling做的
if(ling != 0){
ling = 0;
printf("ling");//正常输出0
space++;
}
if(space != 0){
space --;
printf(" ");//如果上一步输出了0就要输出空格
}
printf("%s %s",nuch[c[i] - '0'],ch[reality - i]);//普通的情况就这样输出就好了
space++;
}
}
if(c[i] != '0'){//最后一位 特殊处理一下
if(space != 0){
space --;
printf(" ");
}
if(ling != 0){
ling = 0;
printf("ling");
space++;
}
if(space != 0){
space --;
printf(" ");
}
printf("%s\n",nuch[c[i] -'0']);
}
if(len == 2&&c[1] == '0'){//特判下0的情况
printf("ling\n");
}
return 0;
}