把数字转为中文表示。主要解决位数和中间/结尾多个0和单个0的情况。
四位四位判断,最多九位。先去掉负号,保证对正数进行判断。标记当前的基数(加万还是亿还是不加)。根据当前的位数判断当前读到的数后面的位数(千/百/十),如果当前数是0就不加位数,往vector里加“ling”。同时像1008/100008这样有多个零时,删去多余0,保证没有多个连续的零。还要注意像800这样的情况时,后面不能有零。如果截到的四位全是0,那应该只加零不加位数。最后再加一个对一位0的特判。
用例不怎么严格,像100003456应该是一亿零三千四百五十六,但是第一版程序输出是一亿万三千四百五十六也全过了,也没有前置很多个0的情况
#include <bits/stdc++.h>
#define INF 99999999
using namespace std;
int n;
vector<string> temp;
string toChinese(char num){
switch(num){
case '0':return "ling";
case '1':return "yi";
case '2':return "er";
case '3':return "san";
case '4':return "si";
case '5':return "wu";
case '6':return "liu";
case '7':return "qi";
case '8':return "ba";
case '9':return "jiu";
default: return "";
}
}
void trans(string str, int radix){
int len=strlen(str.c_str());
if(len==0)return;
if(len==1 && str[0]=='0'){
temp.push_back("ling");
return;
}
bool zero=true;
for(int i=0;i<len;i++){
temp.push_back(toChinese(str[i]));
if(str[i]!='0'){
zero=false;
if(len-i==4)temp.push_back("Qian");
else if(len-i==3)temp.push_back("Bai");
else if(len-i==2)temp.push_back("Shi");
}else{
if(temp[temp.size()-2]=="ling")temp.pop_back();
if(i==len-1)temp.pop_back();
}
}
if(radix==3)temp.push_back("Yi");
else if(radix==2 && !zero) temp.push_back("Wan");
return;
}
int main(){
string str;
str.resize(10);
scanf("%s",&str[0]);
if(str[0]=='-'){
temp.push_back("Fu");
str.erase(0,1);
}
int len=strlen(str.c_str());
if(len>8){
trans(str.substr(0,1),3);
str=str.substr(1,8);
len--;
}
if(len>4){
trans(str.substr(0,len-4),2);
str=str.substr(len-4,4);
len=4;
}
trans(str,1);
for(int i=0;i<temp.size();i++){
printf("%s",temp[i].c_str());
if(i<temp.size()-1)printf(" ");
}
}