#include<bits/stdc++.h>
using namespace std;
string uijn[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string djwz[6]={"Ge","Shi","Bai","Qian","Wan","Yi"};
int b[9]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
int main(){
string a;
cin>>a;
int aa=stoi(a);
int ksge=0;
if(stoi(a)==0){
printf("ling");
return 0;
}
if(a[0]=='-'){
printf("Fu");
aa=-aa;
ksge=1;
}
int part[3],lyklgr=0;
part[0]=aa/b[8];
part[1]=(aa%b[8])/b[4];
part[2]=aa%10000;
/*if(a[0]=='-'){
printf("Fu");
aa=-aa;
ksge=1;
}*/
for(int i=0;i<3;i++){
for(int j=3;j>=0;j--){//局部位置
int curpos=8-4*i+j;//全局的位置
if(curpos>=9) continue;//针对亿部分让他到合理的位数
int cur=(part[i]/b[j])%10;
if(cur!=0){
if(lyklgr){
printf(" ling");
lyklgr=0;
}
if(j==0)
//ksge==1?printf(" %s",uijn[cur].c_str()):printf("%s",uijn[cur].c_str());//个位不用输出单位
ksge==1?cout<<" "<<uijn[cur]:cout<<uijn[cur];
else{
// ksge==1?printf(" %s %s",uijn[cur].c_str(),djwz[j].c_str()):printf("%s %s",uijn[cur].c_str(),djwz[j].c_str());
ksge==1?cout<<" "<<uijn[cur]<<" "<<djwz[j]:cout<<uijn[cur]<<" "<<djwz[j];
}
ksge=1;
}
else{
if(!lyklgr&&j!=0&&aa/b[curpos]>=10){//不能是四位X千X百X十X的个为,且要保证前面有数
lyklgr=1;//在下一个非0数发现后的前面输出0
}
}
}
if(i!=2&&part[i]>0)//最后一部分不能输出,为0不能输出
//printf(" %s",djwz[5-i].c_str());
cout<<" "<<djwz[5-i];
}
return 0;
}
总结
1.抄的大佬的看着风格就知道 非常简练反正不是我这这个菜鸟
2.每一部分都是一个模式,如果是负数要注意把数再加个负号,同时控制空格
3.先把单位什么的都写好方便调用
4.取每一位时因为他是上包要取余10
5.i 一共三位变化,j 每一块四位
6.保证0的正确就是在发现第一个非零数后再在其前面输出0
7.出现其他字符不是别的原因就是你范围超了索引里根本没有
英语
问题