PTA基础编程题目集 7-23币值转换(C++语言实现)
摘要:本文是PTA编程题"币值转换"的题解,涵盖题目描述、输入输出格式及C++语言实现,展示逐位处理数字与单位、处理中文零的财务大写转换算法。
题目描述
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成"贰万叁仟壹百零捌"元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为"cWdQbBai"元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意"零"的用法必须符合中文习惯。
输入样例:
8132273456900输出样例:
iYbQdBcScWhQdBeSfgQjB解题思路
核心问题分析:
将数字金额转换为中文财务大写格式,难点在于"零"的处理规则:
- 连续的多个零只需输出一个"零"(a)
- 每段末尾(万位、亿位等大单位前)的零可以省略
- 万位(W)和亿位(Y)作为分段单位,即使该段全零有时也需保留单位
算法原理:
逐位处理输入字符串。对每一位数字:
- 非零数字:若与上一个非零数字之间隔有零位,先补一个"零"(a),再输出数字和对应单位
- 零数字:不直接输出,但在遇到万/亿位等大单位时,检查该段是否有非零数字以决定是否输出单位
维护last_non_zero记录上一个非零数字的位置(pos),用于判断两个非零数字间是否需要补零,以及判断万/亿单位是否有效。
具体计算步骤:
- 输入数字字符串s,特判s==“0"时直接输出"a”
- 从左到右遍历每一位:
- pos = len-1-i 为当前位的位置权重(个位0、十位1…)
- 非零数字:若last_non_zero-pos > 1则补"a",输出数字+单位,更新last_non_zero
- 零数字:若pos是4或8(万/亿位),且last_non_zero>pos则输出单位
- 输出结果字符串
代码流程说明
- 字符映射初始化:num数组映射0-9到a-j,unit数组映射位置到单位
- 输入与特判:读取输入字符串,若为"0"直接输出"a"
- 遍历处理每一位:
- 计算当前位数字d和位置pos
- d≠0时:检查间隔补零→写入数字→写入单位→更新last_non_zero
- d=0时:若为分段单位(万/亿)且前面有有效数字则写入单位
- 字符串终止与输出:添加终止符’\0’后输出结果
代码流程图
解题流程图
代码部分实现
#include<iostream>#include<cstring>usingnamespacestd;// 数字映射:'a'代表0, 'b'代表1, ..., 'j'代表9charnum[]="abcdefghij";// 单位映射:索引0无单位(个位), 1:拾(S), 2:百(B), 3:仟(Q), 4:万(W), 5:拾(S), 6:百(B), 7:仟(Q), 8:亿(Y)charunit[]={'\0','S','B','Q','W','S','B','Q','Y'};intmain(){chars[20];cin>>s;intlen=strlen(s);// 特判:输入为0时直接输出"a"if(strcmp(s,"0")==0){cout<<"a"<<endl;return0;}charresult[100]={0};// 存储转换后的结果字符串intres_idx=0;// result数组的当前写入位置intlast_non_zero=-1;// 记录上一个非零数字的位置(从右往左数的位数)// 从左向右遍历输入的每一位数字for(inti=0;i<len;i++){intd=s[i]-'0';// 当前数字intpos=len-1-i;// 当前数字的位置权重(个位为0,十位为1...)if(d!=0){// 如果当前非零数字与上一个非零数字之间隔了至少一位(即存在零),则需要补一个"零"(a)// 例如:101 -> 百位1和个位1之间隔了十位(pos=1),需要补零if(last_non_zero!=-1&&last_non_zero-pos>1){result[res_idx++]=num[0];}// 添加当前数字对应的字符result[res_idx++]=num[d];// 添加对应的单位(个位pos=0时不加单位)if(pos>0){result[res_idx++]=unit[pos];}last_non_zero=pos;// 更新最近非零数字的位置}else{// 当前数字为0时的处理// 对于"万"(pos=4)和"亿"(pos=8)这样的大单位,即使其中间数位为0,也需要保留单位// 例如:813227345中,亿位后面的千万、百万等都是0,但仍需输出"Y"(亿)if(pos%4==0&&pos>0){// 只有当前面出现过非零数字(当前数段有效)时,才输出该大单位if(last_non_zero!=-1&&last_non_zero>pos){result[res_idx++]=unit[pos];}}}}result[res_idx]='\0';// 字符串终止cout<<result<<endl;return0;}