数据结构Java版 金额的中文大写

题目描述

读入一个浮点数值,将其转化为金额的中文大写形式。
例如:
         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;
	} 
	    
 } 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值