PTA7-3币值转换

原题如下:

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

输入格式:

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

输出格式:

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

———————————————————————————————————————————

以下为我的解题思路:

首先,根据题目得知,我们输入的是数字0到9,输出的却要求用字母a到j,因此,我们采用java的散列表来存储每位数字的转换,键为数字0到9,值为字母a到j,对于单位,我们做相同的处理,用计数变量累计10的1到8次方中的指数部分(2到9位才有单位),将其作为单位散列表的键,值则为SBQWSBQY(十万、百万、千万、也是S、B、Q,且单位之间插入数字,单位是分离开的)

其次,按照一般的分离整数各位数字的方法,是从右到左的,而我们输出却要求从左到右,因此,我们采用堆栈结构来保存输出的内容,将每位数字以及单位分离后存入栈中

最后,我们还要解决的问题是“零”的用法要符合中文习惯的要求,零在整数中的位置有末尾和中间之分,在末尾的时候我们一般不将零念出来,在中间是如果隔着多个单位都是0,那么也只念1个0,且不念0的那一位的单位,而在中间时,还有一种特殊情况就是“千”以上的位数,如果连续多个0(如10003000),那么零也是不需要念的,但单位“万”依旧需要念(如10003000念作:一千万三千,而不是一千万零三千或一千零三千(不念万));

具体实现以上功能的代码如下:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, String> 面值 = new HashMap<Integer, String>();
        面值.put(0, "a");
        面值.put(1, "b");
        面值.put(2, "c");
        面值.put(3, "d");
        面值.put(4, "e");
        面值.put(5, "f");
        面值.put(6, "g");
        面值.put(7, "h");
        面值.put(8, "i");
        面值.put(9, "j");
        HashMap<Integer, String> 单位 = new HashMap<Integer, String>();
        单位.put(1, "S");
        单位.put(2, "B");
        单位.put(3, "Q");
        单位.put(4, "W");
        单位.put(5, "S");
        单位.put(6, "B");
        单位.put(7, "Q");
        单位.put(8, "Y");
        Scanner input = new Scanner(System.in);
        int 币值 = input.nextInt(), 计数 = 0, i = 0, flag = 0;
        Stack<String> output = new Stack<String>();
        if (币值 == 0) {
            System.out.print(面值.get(币值));
        }
        while(币值>0){
            i=币值%10;
            if(计数>0&&i!=0){
                output.push(单位.get(计数));
            }//单位输出条件:面值部分不为0
            if(计数==0&&i==0){
                while(币值%10==0){
                    币值/=10;
                    计数++;
                    if(计数==4&&币值%10==0){
                        output.push(单位.get(计数));//十,百,千,万单位也为0的情况下才自动输出万
                    }
                }
                continue;
                //已经到达末尾非0状态,无需++,接下来直接下一轮循环
            } else if(计数==4&&i==0){//万以下不为0,万以上又有000结尾
                while(币值%10==0){
                    if(计数==4&&币值%10==0){
                        output.push(单位.get(计数));//十,百,千有不为0,但万单位为0的情况下自动输出万
                    }
                    币值/=10;
                    计数++;
                }
                continue;
            }else{
                if(计数==0)//debug3计数为0时堆栈为空,直接输入面值内容
                    output.push(面值.get(i));
                else if(output.peek()=="a"){
                    //debug3若顶部为0,则继续下一个单位
                }else {
                    output.push(面值.get(i));
                }
            }
            计数++;
            币值/=10;
        }
        while(output.isEmpty()==false){
            System.out.print(output.pop());
        }
    }
}

PTA打分如下:

总结:

中文习惯中的千万是连在一起作为一个单位的,但是具体输出的时候,千万表示的是千个万,因此,万是类似于个位的默认存在的一个基础单位,个位不需要输出,但是万必须要输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值