【题意】
给出一个至多9位的整数,用中文读法读出来
【思路】
首先如果是负的就输出“Fu "并取相反数,然后由于亿位最多只有一位,也容易处理。对于万级别和小于万级别的数可以写一个函数统一读,这个函数可以读1、2、3、4位,并根据之前有没有输出过数字、有没有输出过'ling'判断是否输出空格、'ling',并输出非零数字和单位。
【注意点】
写的过程中对于空格的输出可能会出一些差错,需要自己多试一些数字找出可能出错的地方,照顾到各种特殊情况。-0,10086(4位中有连续的0)等都是可能的测试点。
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
string digit[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string readDigits(int cnt, int num, bool flag, bool zf){
if(num==0){
return "";
}
string str;
if(flag){
str = " ";
}
else{
str = "";
}
switch(cnt){
case 4:
if(num/1000){
str.append(digit[num/1000]);
str.append(" Qian");
str.append(readDigits(3,num%1000,true,zf));
}
else{
if(flag){
str.append(digit[0]);
zf = true;
}
str.append(readDigits(3,num%1000,flag,zf));
}
break;
case 3:
if(num/100){
str.append(digit[num/100]);
str.append(" Bai");
str.append(readDigits(2,num%100,true,zf));
}
else{
if(flag && !zf){
str.append(digit[0]);
zf = true;
}
else{
str = "";
}
str.append(readDigits(2,num%100,flag,zf));
}
break;
case 2:
if(num/10){
str.append(digit[num/10]);
str.append(" Shi");
str.append(readDigits(1,num%10,true,zf));
}
else{
if(flag && !zf){
str.append(digit[0]);
zf = true;
}
else{
str = "";
}
str.append(readDigits(1,num%10,flag,zf));
}
break;
case 1:
str.append(digit[num]);
break;
default:
break;
}
return str;
}
int main(int argc, char const *argv[])
{
long long num;
bool flag = false;
cin >> num;
if(num<0){
cout << "Fu ";
num = -num;
}
if(num/100000000!=0){
cout << digit[num/100000000] << " Yi";
num %= 100000000;
flag = true;
}
if(num/10000!=0){
string str = readDigits(4,num/10000,flag,false);
cout << str << " Wan";
num %= 10000;
flag = true;
}
string str = readDigits(4,num,flag,false);
if(!flag && str==""){
cout << digit[0];
}
else{
cout << str;
}
system("pause");
return 0;
}