input:-123456789
output:
Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
input:100800
output:
yi Shi Wan ling ba Bai
input:-880808080
output:
Fu ba Yi ba Qian ling ba Shi Wan ba Qian ling ba Shi
intput:800000000
output:
ba Yi
intput:80000008
output:
ba Qian Wan ling ba
ac代码
推荐
#include<iostream>
using namespace std;char num[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};char wei[5][5]={"Shi","Bai","Qian","Wan","Yi"};intmain(){
string str;getline(cin, str);int len = str.length();int left =0, right = len-1;// 指向字符串首尾if(str[0]=='-')// 负数, 打印输出"负数",left右移动1位{printf("Fu");
left++;}while(left +4<= right)// 每次左移动4位,直到left与right在同一节
right -=4;while(left < len){
bool flag = false;// 无累积0
bool isPrint = false;// 该节未输出其中的位while(left <= right){if(left >0&& str[left]=='0')// 当前位为0, 标记flag为true
flag = true;else{if(flag == true)// 存在累积0{printf(" ling");
flag = false;}if(left >0)printf(" ");
isPrint = true;printf("%s", num[str[left]-'0']);if(left != right)// 除个位外,都需要输出十百千printf(" %s", wei[right - left -1]);}
left++;// left 右移1位}if(isPrint == true && right != len-1)// 非个位,输出万或亿printf(" %s", wei[(len-1-right)/4+2]);
right +=4;}return0;}
学习代码
#include<iostream>#include<string>#include<vector>
using namespace std;
string num[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string c[6]={"Ge","Shi","Bai","Qian","Yi","Wan"};int J[]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
vector<string> res;intmain(){int n;
cin >> n;if(n ==0){
cout <<"ling";return0;}if(n <0){
cout <<"Fu ";
n =-n;}int part[3];
part[0]= n /100000000;
part[1]=(n %100000000)/10000;
part[2]= n %10000;
bool zero = false;//是否在非零数字前输出合适的lingint printCnt =0;//用于维护单词前没有空格,之后输入的单词都在前面加一个空格。for(int i =0; i <3; i++){int temp = part[i];//三个部分,每部分内部的命名规则都一样,都是X千X百X十Xfor(int j =3; j >=0; j--){int curPos =8- i *4+ j;//当前数字的位置if(curPos >=9)continue;//最多九位数int cur =(temp / J[j])%10;//取出当前数字if(cur !=0){if(zero){
printCnt++==0? cout<<"ling": cout<<" ling";
zero = false;}if(j ==0)
printCnt++==0? cout << num[cur]: cout <<' '<< num[cur];//在个位,直接输出else
printCnt++==0? cout << num[cur]<<' '<< c[j]: cout <<' '<< num[cur]<<' '<< c[j];//在其他位,还要输出十百千}else{if(!zero && j !=0&& n / J[curPos]>=10) zero = true;//注意100020这样的情况}}if(i !=2&& part[i]>0) cout <<' '<< c[i +4];//处理完每部分之后,最后输出单位,Yi/Wan}return0;}
1082 Read Number in Chinese (25 分| 字符串处理,附详细注释,逻辑分析)
写在前面实现思路字符串存储、处理分节(个位节,万位节,亿位节)循环处理,4位1节根据上图自我领会,不太擅长处理该问题,,,如有必要自行实现,或调试ac代码理解其逻辑细节处理较为复杂,手写推理规律(不太熟悉中文读法),耗费时间较长测试用例input:-123456789output:Fu yi Yi er Qian san Bai si Shi wu Wan ...