当前位置: 首页 > news >正文

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;}
http://www.cnnetsun.cn/news/3944940.html

相关文章:

  • 中介者模式:解耦复杂交互的设计模式实践
  • 网盘直链下载助手完整指南:九大网盘高速下载免费解决方案
  • Adobe-GenP 3.0:5分钟完成Adobe全系列软件激活的终极指南
  • 关于cesium初始化配置参数说明
  • Noto Emoji字体终极指南:告别乱码,轻松实现跨平台统一表情显示
  • 金融数据分类分级实战系列三:生成全量数据清单
  • WorkshopDL高效指南:一站式免费获取Steam创意工坊模组的智能解决方案
  • VMware虚拟机安装Windows XP Media Centre Edition完整教程与优化指南
  • 终极指南:5个简单步骤让旧Mac免费升级最新macOS系统
  • 多端商城怎么做?一套代码 vs 各端各写,4 个开源项目的实现路线对比
  • 2.宏碁掠夺者擎控制台无法识别电源状态?一次驱动层排查与修复实录
  • ArrayList与LinkedList核心差异及性能对比
  • HTTP请求死循环:原理、检测与防御实践
  • 终极文档下载神器:如何免费下载百度文库、原创力文档等30+平台内容
  • 告别繁琐手动操作:百度网盘批量转存神器5分钟上手指南
  • 如何实现跨平台游戏模组下载:WorkshopDL终极完整指南
  • 从零构建游戏服务器:基于Netty与Java的DNF私服技术解析
  • Palantir 给中国企业上了一课:AI 落地缺的不是模型,是“操作系统“
  • HTTP解析器核心原理与实战:从状态机到高性能网络编程
  • Unity物理系统跨平台适配鸿蒙:从核心原理到实战优化
  • 百度网盘批量转存工具深度解析:从技术原理到高效实战
  • 原神帧率解锁终极指南:3步轻松突破60FPS限制的完整教程
  • 从零构建高性能文件传输服务:Spring Boot + MinIO 架构实战
  • Kimi K3 API实战指南:200万字上下文大模型开发集成与国产替代方案
  • 2024年网站建设谈单技巧揭秘:从初次沟通到成功签单的实战指南
  • WindowsCleaner终极指南:如何3分钟解决C盘爆红问题
  • 基于AI智能体与Dify框架的社交趋势分析系统构建实战
  • 高校教务处排课痛点深度解析
  • YOLO乡村庭院冷却器目标检测数据集
  • 3分钟掌握Chrome网页文本智能批量替换:高效解决网页内容统一修改难题