题目描述
读入一个浮点数值,将其转化为金额的中文大写形式。
例如:
123.45转化为“壹佰贰拾叁元肆角伍分”。
1)当金额为整数时,只表示整数部分,省略小数部分,并添加“整”字。
例如:123表示为“壹佰贰拾叁元整”
2)当金额中有连续的0时(含一个0),只需写一个“零”即可。
例如:10005表示为“壹万零伍元整”
3)10元缩写为“拾元整”。
输入
表示金额的浮点数若干,每行一个
输出
各金额的中文大写形式,每行一个
注:数字“壹贰叁肆伍陆柒捌玖拾佰仟万亿”
单位“元角分”
样例输入
123.45 123 10005 10
样例输出
壹佰贰拾叁元肆角伍分 壹佰贰拾叁元整 壹万零伍元整 拾元整
分析:本题不断模拟加暴力枚举就行
#include<iostream>
#include<string.h>
using namespace std;
char b[10][11]={"亿","万","仟","佰","拾"};//定义进制
char c[11][11]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖",};//定义数字汉字
char e[4][11]={"元","角","分","整"}; //定义情况
int main()
{
char a[100],f[100][11];//a为输入的数字字符串,f为输出的汉字字符串
int size,j=0,t;
while(cin>>a)
{
j=0;
memset(f,0,sizeof(f));//初始化将f清零
size=strlen(a);
/筛选小数部分//
if(a[size-3]=='.')//数字包含角和分的情况
{
strcpy(f[++j],e[2]);//将最后一位分的单位储存到字符串中
strcpy(f[++j],c[a[size-1]-'0']);//储存分对应的数字大小
if(a[size-2]!='0')//考虑角的单位为零的情况,为零则跳过
{
strcpy(f[++j],e[1]); //将最后一位角的单位储存到字符串中
strcpy(f[++j],c[a[size-2]-'0']);//储存角对应的数字大小
}
strcpy(f[++j],e[0]);//将元的单位储存到字符串中
t=size-4;
}
else if(a[size-2]=='.')//数字仅包含角的情况
{
strcpy(f[++j],e[1]);//将最后一位角的单位储存到字符串中
strcpy(f[++j],c[a[size-1]-'0']);//储存分对应的数字大小
strcpy(f[++j],e[0]);//将元的单位储存到字符串中
t=size-3;
}
else//数字直接从元开始
{
strcpy(f[++j],e[3]);//将元的单位储存到字符串中
strcpy(f[++j],e[0]);//顺应题意要求将'整'也要放入字符串中
t=size-1;
}
///筛选整数部分///
int s=0,r=0;//s代表循环数,4个数位一循环,即个、十、百、千
for(int i=t;i>=0;i--)
{
if(s%4==0)//个位
{
if(r==1)//当数字已经读取到万级时,要额外输出一个'万'
strcpy(f[++j],b[1]);
else if(r==2)//当数字已经读取到亿级时,要额外输出一个'亿'
strcpy(f[++j],b[0]);
if(a[i]!='0')//个级数对应输出(除零外)
strcpy(f[++j],c[a[i]-'0']);
s=0;
r++;
}
else if(s%4==1)//十位
{
if(a[i]!='0'&&a[i]!='1')//十位的情况比较特殊,在不为0或1时正常输出
{
strcpy(f[++j],b[4]);//输出一个十级单位
strcpy(f[++j],c[a[i]-'0']);//输出十级对应的数
}
else if(a[i]=='1')//为1时,仅输出单位即可
{
strcpy(f[++j],b[4]);
}
else if(a[i]=='0'&&a[i+1]!='0')//为零时,考虑下级(即个位)是否为零
{ //不为零时输出零
strcpy(f[++j],c[a[i]-'0']);
}
}
else if(s%4==2)//百位
{
if(a[i]!='0')//不为零时正常输出
{
strcpy(f[++j],b[3]);//输出一个百级单位
strcpy(f[++j],c[a[i]-'0']);//输出百级对应的数
}
else if(a[i]=='0'&&a[i+1]!='0')//为零时,考虑下级(即十位)是否为零
{ //不为零时输出零
strcpy(f[++j],c[a[i]-'0']);
}
}
else if(s%4==3)//千位
{
if(a[i]!='0')//不为零时正常输出 (千级为四个数位中的最高数位,不受0影响)
{
strcpy(f[++j],b[2]);//输出一个千级单位
strcpy(f[++j],c[a[i]-'0']);//输出千级对应的数
}
}
s++;//对筛选数位进行升级
}
for(int i=j;i>=1;i--)
{
cout<<f[i]; //筛选时时倒序筛选,所以也要倒序输出
}
cout<<endl;
}
}