PAT7-23币值转换通俗解法

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:

gQjB

本题虽然是20分,但本人认为此题可以有25分的水准,原因是对于0的情况的特殊处理非常难以想到和想全,而对于这些特殊情况又难以处理得当,于是将本题难度推上了一个台阶。本人结合网上已经通过的算法,写出如下算法并附上详细注释:

#include<iostream>
using namespace std;
int main()
{
	int n,cur_bit,pre_bit,i=0,bitnum=0;
	/*定义输入数,当前位,前一位,下标计数器,位数计数器*/
	char num[10]={'a','b','c','d','e','f','g','h','i','j'};
	/*定义数字转字母数组,下标以当前位上的数字访问*/
	char unit[10]={0,0,'S','B','Q','W','S','B','Q','Y'};
	/*定义位数转单位数组,下标以位数访问,前两位忽略,位数为2即下标为2的位置对应十位*/
	char result[17]={0};
	/*定义结果数组,存放字符,最长9+8=17位,存储从后往前,故先存单位,后存数字
	如遇和0相关的特殊情况,只存数字,不存单位,但如果是万位,无论是否为0必须存单位 
	如果是千位,不存数字和单位 
	*/
	cin>>n;
	if(n)
	{
		pre_bit=n%10;
		while(n)
		{
			cur_bit=n%10;//获得当前位 
			bitnum++;//位数自增 
			n/=10;
			if(cur_bit==0)//若当前位为0 
			{/*则如果是个位或千位,不存0和单位,如果是万位,不存0但一定存单位*/
			/*除个位,千位和万位,如果前一位非0,则存当前位的0*/
				if(pre_bit!=0&&bitnum%4>1)//若前一位不为0且当前位不为个,千,万 
				result[i++]=num[cur_bit];//存数字,注意下标是当前位上的数字 
				if(bitnum==5)//若位数为5 
				result[i++]=unit[bitnum];//存单位,即万,注意下标是当前位数 
			}
			else//若当前位不为0 
			{
				if(bitnum>=2)//若当前位数不小于2,即从十位开始 
				result[i++]=unit[bitnum];//存单位
				result[i++]=num[cur_bit];//无论怎样,都存对应字母 
			}
			pre_bit=cur_bit;//保存当前位作为下一位的前一位 
		}	
		for(int j=i-1;j>=0;j--)
		cout<<result[j];
	}
	else
	cout<<num[0];
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/80637016
今日推荐