#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<string> #include<algorithm> #include<map> #include<vector> #include<queue> using namespace std; //key:每节每节地处理,在该节中遍历每位,如果当前位非首位且为0才令flag=true //如果当前位非0并且flag为true则要输出ling. //注意十百千 和 万亿 单位的输出 char num[10][5]={ //num[0]="ling" ,num[1]="yi"..... "ling","yi","er","san","si","wu","liu","qi","ba","jiu" }; char wei[5][5]={"Shi","Bai","Qian","Wan","Yi"}; int main(){ char str[15]; cin>>str; //按字符串方式输入数字 int len=strlen(str); //字符串长度 int left=0,right=len-1; //left与right分别指向字符串首尾元素 if(str[0] == '-'){ //如果是负数,则输出"Fu",并把left右移动右移动一位 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 && str[left] == '0'){ //如果当前位为0 flag=true; }else{ //如果当前位不为0 if(flag==true){ //如果存在累积的0 printf(" ling"); flag=false; } //只要不是首尾(包括负号),后面的每一位前都要输出空格 if(left > 0) printf(" "); printf("%s",num[str[left]-'0']);//输出当前的数字f isPrint=true; //该节至少有一位被输出 if(left != right){ //某节中除了个位外,都要输出十百千 printf(" %s",wei[right-left-1]); } } left++; } if(isPrint == true && right !=len-1){ //只要不是个位,就输出万或亿 printf(" %s",wei[(len-1-right)/4+2]); } right+=4; //right右移动4位,输出下一节 } system("pause"); return 0; }