整体思路,读入int,首先判断正负,单独输出“Fu”,然后转化为正数处理;
将数字转化为字符串存储(0-8位),高位在前,即位置0存的是亿位,位置8存的是个位;
从第一个非零位置开始输出,对应位数字非0,则输出该数字及对应的位名;若对应位数字为0,按照规则,亿万个其实是3个分界,亿和万之间、万和个之间至多读一个零,也可能不读零,连续的0只需要读一次,并且不需要读对应的位名,若在万位或者个位之前零中断了就读出零,如10021002读为一千零二万一千零二,如果连续的零跨过了万或者恰好在万位处断则不读出零,如13001000读作一千三百万一千,3后面连续的零到万位中断,这个零不会被读出来,一千后面的零也不必读出来,因为连续的零到个位中断;
注意到1到4位读的规律和5到8位读的规律是一样的,只不过到第四位时需要加“万”,第八位不需要加“个”,但是如果1到4位都为0的话,就不必输出万了。
综上简单地说,就是从第一个非零数字开始输出,若对应位数字非零,则输出数字及对应单位,遇到连续的0不做处理,(但是不能用continue,因为后面特判wan的时候在100800情况下用continue会跳过特判wan),连续的0在万或个之前中断输出ling,在万和个处0不连续不输出ling;特殊处理输出wan,1-4位有一个不为0就输出wan;在输出数字前后来添加空格,保证格式。
测试点0就是没有零顺着读的简单情况;
测试点1是100800这种情况;
测试点3就是一个0,特判一下就好,独立想到的,开心呜呜;
·
·
·
完整代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
string number[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string wei[9]={"Yi","Qian","Bai","Shi","Wan","Qian","Bai","Shi",""};
int main() {
int n;
cin >> n;
if(n<0){
n=-n;
cout << "Fu ";
}
char num[9];
int tmp=n;
for(int i=0;i<9;i++){
num[i]=tmp%10+'0';
tmp=tmp/10;
}
reverse(num,num+9);
bool wan=false;
int nonzero=9;//先寻找第一个非零位置
for(int i=0;i<9;i++){
if(num[i]!='0'){
nonzero=i;
break;
}
}
//从第一个非零位置读起
for(int i=nonzero;i<9;i++){
if(num[i]!='0'){
if(i>=1 && i<=4) wan=true;//1-4位有一个非零数字,就要输出单位万
if(i!=nonzero) cout << " ";//第一个数字前无空格,以后的非零数字都要加空格隔开前面的单位
if(i!=4 && i!=8) cout << number[num[i]-'0'] << " " << wei[i];//i=4对应万,i=8对应个,都单独处理
else if(i==8) cout << number[num[i]-'0'];//单独处理个位,没尾部空格
}else{//遇到零了
if(i+1<9 && num[i+1]=='0'){
;//不能用continue,对于100800,i==4需要特殊处理wan了,一旦continue后面就无法特判了
}
else if(i!=4 && i!=8){//不是万或个处0中断才输出ling
cout << " ling";
}
}
//wan单独处理一下
if(i==4 && wan==true){
if(num[i]!='0')
cout << number[num[i]-'0']<< " " << wei[i];//万这位非0,在前面i!=nonzero时已经输出过空格了
else cout << " " << wei[i];//万这位为0,说明前面以单位结尾,需要加个空格
}
}
if(nonzero==9) cout << "ling";
return 0;
}