三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

PTA基础编程题目集 7-23币值转换(C++语言实现)

PTA基础编程题目集 7-23币值转换(C++语言实现)

摘要:本文是PTA编程题"币值转换"的题解,涵盖题目描述、输入输出格式及C++语言实现,展示逐位处理数字与单位、处理中文零的财务大写转换算法。

题目描述

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成"贰万叁仟壹百零捌"元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为"cWdQbBai"元。

输入格式:

输入在一行中给出一个不超过9位的非负整数。

输出格式:

在一行中输出转换后的结果。注意"零"的用法必须符合中文习惯。

输入样例:

813227345
6900

输出样例:

iYbQdBcScWhQdBeSf
gQjB

解题思路

核心问题分析
将数字金额转换为中文财务大写格式,难点在于"零"的处理规则:

  1. 连续的多个零只需输出一个"零"(a)
  2. 每段末尾(万位、亿位等大单位前)的零可以省略
  3. 万位(W)和亿位(Y)作为分段单位,即使该段全零有时也需保留单位

算法原理
逐位处理输入字符串。对每一位数字:

  • 非零数字:若与上一个非零数字之间隔有零位,先补一个"零"(a),再输出数字和对应单位
  • 零数字:不直接输出,但在遇到万/亿位等大单位时,检查该段是否有非零数字以决定是否输出单位

维护last_non_zero记录上一个非零数字的位置(pos),用于判断两个非零数字间是否需要补零,以及判断万/亿单位是否有效。

具体计算步骤

  1. 输入数字字符串s,特判s==“0"时直接输出"a”
  2. 从左到右遍历每一位:
    • pos = len-1-i 为当前位的位置权重(个位0、十位1…)
    • 非零数字:若last_non_zero-pos > 1则补"a",输出数字+单位,更新last_non_zero
    • 零数字:若pos是4或8(万/亿位),且last_non_zero>pos则输出单位
  3. 输出结果字符串

代码流程说明

  1. 字符映射初始化:num数组映射0-9到a-j,unit数组映射位置到单位
  2. 输入与特判:读取输入字符串,若为"0"直接输出"a"
  3. 遍历处理每一位
    • 计算当前位数字d和位置pos
    • d≠0时:检查间隔补零→写入数字→写入单位→更新last_non_zero
    • d=0时:若为分段单位(万/亿)且前面有有效数字则写入单位
  4. 字符串终止与输出:添加终止符’\0’后输出结果

代码流程图

开始

定义num和unit映射数组

输入字符串s

输入是否为0

输出a并结束

初始化result和变量

i从0开始

i是否小于长度

result添加终止符

计算当前数字和位置

当前数字非零

是否需要补零

写入零字符a

写入数字字符

位置是否大于0

写入对应单位

更新最近非零位置

i递增

当前是万或亿位

前面有非零数字

写入万或亿单位

输出result

结束

解题流程图

输入数字字符串

输入是否为0

输出a

从左到右逐位处理

取当前位和位置

当前位非零

与上一非零位有间隔

补一个零a

输出数字字符

位置大于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;}
← 返回列表