a1082题解

这题实在是太难了 复杂 这里晴神 用了左右记录标记的方法 十分 巧妙 多多学习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

#include<cstring>
char num[10][5] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
char unit[5][5] = {"Shi", "Bai", "Qian", "Wan", "Yi"};
int () {
char a[20];
scanf("%s", &a);
int len = strlen(a);
int left = 0, right = len - 1;
if(a[0] == '-') {
printf("Fu");
left++;
}
while(left + 4 <= right) {
right -= 4; //将right每次左移4位 直到left与right在同一节内
}
while(left < len) { //循环每次处理数字的一节(4位或小于4位)
bool flag = false; //flag == false 表示没有累积的0
bool isPrint = false; //isPrint == false 表示该节没有输出过其他的位
while(left <= right) { //从左到右处理数字中的某一节的每一位
if(left > 0 && a[left] == '0') { //如果当前位为0
flag = true; //令标记flag 为 true
} else { //如果当前位不为0
if(flag == true) { //如果有累积的0
printf(" ling");
flag = false;
}
//只要不是首位(包括负号), 后面的每一位前都要输出空格
if(left > 0) printf(" ");
printf("%s", num[a[left] - '0']);
isPrint = true; //该节至少有一位输出
if(left != right) { //某节中除了个位外,都需要输出十百千
printf(" %s", unit[right - left - 1]);
}
}
left++; //left右移1位
}
if(isPrint == true && right != len - 1) { //只要不是个位 就输出万或亿
printf(" %s", unit[(len - 1 - right)/4 + 2]);
}
right += 4; //right 右移4位 输出下一节
}
return 0;
}