题意:将一串数字转换成中文读法
思路:
按照中文读法的规律,将数字按每四位为一组分三组进行处理,如果各组加和>0则加上后缀亿或万。
因此第一步是读入数字识别正负,提取数字到一个数组且补零到12位。for循环,3组进行分别细节0的处理。
细节1:第一个数字输入前不能有空格,用count来进行标记;
细节2:零的处理,有两种情况要补零
(1)组内补零:如1001
,101
,此时的0
就要输出ling
;观察发现只要0
在第2、3
位且0
前面存在非0数字即要补零,inner_flag
来标注,出现了数字就置为true
,组内(第二个循环)出现0
后就进行组合条件判断,较为简单。
(2)组外补零:邻组如1 0001
,1 0010
,1 0100
,跨组如1 0000 0001
,思路类似,但为了代码简化,用bool flag[3]
数组来标注,第一层循环组合内数字加和非零时置true
,从第二组开始,每一组的第一个数字出现时进行flag[i-1]
判断,输出后必须将flag[i-] = false
,避免重复补零
#include<bits/stdc++.h>
using namespace std;
int main()
{
char han[10][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string num;
cin >> num;
if(num[0] == '-') {
cout << "Fu ";
num = num.substr(1);
}
if(num[0] == '0') printf("ling");
else{
int ans[12];
memset(ans,0,sizeof(ans));
for(int i = 0 ; i < num.length() ; i++){
ans[i+12-num.length()] = num[i] - '0' ;
}
int count = -1;
bool flag[3];
for(int i = 0;i<3;i++){
if(ans[0+i*4]+ans[1+i*4]+ans[2+i*4]+ans[3+i*4] != 0){
flag[i] = true;
for(int j = 0 ; j < 4;j++){
bool inner_flag = false;
if(ans[j+i*4] != 0){
count++;
if(count>=1) {
printf(" ");
}
printf("%s",han[ans[j+i*4]]);
if( j == 0) printf(" Qian");
else if(j == 1) printf(" Bai");
else if(j == 2) printf(" Shi");
inner_flag = true;
}
else{
if(i>0){
if(flag[i-1]){
printf(" ling");
flag[i-1] = false;
}
}
}
if(inner_flag&&j!=0&&j!=3&&ans[j+i*4]==0) printf("ling ");
}
if (i == 0) printf(" Yi");
else if(i == 1) printf(" Wan");
}
}
}
return 0;
}