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

📅 2026/7/30 23:12:21
PTA基础编程题目集 7-23 币值转换(C语言实现)
摘要本题要求编写程序将输入的不超过9位整数的人民币金额转换为符合财务规范的大写中文格式。输出使用小写字母 a-j 表示数字 0-9S/B/Q/W/Y 分别代表拾/百/仟/万/亿并需正确遵循中文零的使用习惯。文章给出了输入输出样例及一个完整的 C 语言实现。题目描述输入一个整数位数不超过 9 位代表一个人民币值单位为元请转换成财务要求的大写中文格式。如 23108 元转换后变成“贰万叁仟壹百零捌”元。为了简化输出用小写英文字母 a-j 顺序代表大写数字 0-9用 S、B、Q、W、Y 分别代表拾、百、仟、万、亿。于是 23108 元应被转换输出为“cWdQbBai”元。输入格式输入在一行中给出一个不超过 9 位的非负整数。输出格式在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。输入样例8132273456900输出样例iYbQdBcScWhQdBeSfgQjB代码部分实现程序核心逻辑流程如下图所示是否是否是是否否是否开始读取输入字符串 ss 是否为 0?输出 a程序结束初始化 result 数组、res_idx、last_non_zero -1for i 0 到 len - 1计算 d s[i] - 0pos len - 1 - id ! 0 ?若需要补零添加 a添加 num[d]若 pos0 添加 unit[pos]更新 last_non_zero posi len - 1 ?pos % 4 0 且 pos 0 ?前面出现过非零数字 且 该数段有效?添加单位 unit[pos]输出 result程序结束#includestdio.h#includestring.h// 数字映射a 代表 0, b 代表 1, ..., j 代表 9charnum[]abcdefghij;// 单位映射索引 0 无单位个位1:拾S2:百B3:仟Q4:万W5:拾S6:百B7:仟Q8:亿Ycharunit[]{\0,S,B,Q,W,S,B,Q,Y};intmain(){chars[20];scanf(%s,s);intlenstrlen(s);// 特判输入为 0 时直接输出 aif(strcmp(s,0)0){printf(a\n);return0;}charresult[100]{0};// 存储转换后的结果字符串intres_idx0;// result 数组的当前写入位置intlast_non_zero-1;// 记录上一个非零数字的位置从右往左数的位数// 从左向右遍历输入的每一位数字for(inti0;ilen;i){intds[i]-0;// 当前数字intposlen-1-i;// 当前数字的位置权重个位为 0十位为 1...if(d!0){// 如果当前非零数字与上一个非零数字之间隔了至少一位即存在零则需要补一个零(a)// 例如101 - 百位1和个位1之间隔了十位(pos1)需要补零if(last_non_zero!-1last_non_zero-pos1){result[res_idx]num[0];}// 添加当前数字对应的字符result[res_idx]num[d];// 添加对应的单位个位pos0时不加单位if(pos0){result[res_idx]unit[pos];}last_non_zeropos;// 更新最近非零数字的位置}else{// 当前数字为0时的处理// 对于万(pos4)和亿(pos8)这样的大单位即使其中间数位为0也需要保留单位// 例如813227345中亿位后面的千万、百万等都是0但仍需输出Y(亿)if(pos%40pos0){// 只有当前面出现过非零数字当前数段有效时才输出该大单位if(last_non_zero!-1last_non_zeropos){result[res_idx]unit[pos];}}}}result[res_idx]\0;// 字符串终止printf(%s\n,result);return0;}