网上给的解法没看懂,复杂到哪怕通过了也怀疑自己是不是写错了2333
主要是0的问题,多个0/后边全是0没有数情况有所不同,还有十几在只有两位数的时候要读 十几 ,在三位数及以上的时候要读 一十几,就很麻烦。
#include <iostream>
#include <cstring>
using namespace std;
/*
数的读法
输入格式
有一个数字串,数值大小不超过2,000,000,000。10位数
输出格式
是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。
*/
const string sg[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main()
{
string s;
int a[15],i,n,p;
int flag=0;
a[15]={0};
i=0;
cin>>s;
n=s.length();
for(i=0;i<n;i++)
{
p=s[i]-'0';
if(p != 0)
{
flag=0;
if (s[i-1]-'0'==0) //这一位不是0但上一位是0
cout<<"ling ";
if ((n-i)%4==2 && p==1 && i==0) //剩余两位数(十位)/六位数(十万位)...
{
cout<<"shi ";
continue;
}
cout<<sg[p];
cout<<" ";
if((n-i)%4==2) cout<<"shi ";
if ((n-i)%4==3) cout<<"bai ";
if ((n-i)%4==0) cout<<"qian ";
}
if ((n-i)%4==1)//除四余一
{
if ((n-i)/4==2)//九位数
{
flag=1;
cout<<"yi ";
}
if ((n-i)/4==1 && flag==0) //五位数,且后四位不全为0
cout<<"wan ";//如果不到亿位,则flag默认0,wan可输出,若后四位全为0,则flag在yi已经置1,没有机会置0,wan不输出
}
}
return 0;
}