PTA 7-23 币值转换的Java实现

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

输入格式:

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

输出格式:

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

输入样例1:

813227345

输出样例1:

iYbQdBcScWhQdBeSf

输入样例2:

6900

输出样例2:

gQjB

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

中国人阅读数字的习惯是以四位为一个单位阅读,因此可以以四位为段进行划分

共性是每四位中都有“十,百,千”三个单位

0的阅读限制较多,因此在许多地方都做了限制。

代码也因此非常冗长。

望各位大佬们批评指正

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        String mon = sca.next();
        int[] num = new int[mon.length() + 1];
        String[] uni = {"","S", "B", "Q"};
        char[] lit = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
//        统计一下字符长度,后面会重复使用
        int length = mon.length();
        int count = 0;
//        将每一位的数字放入数组中,num[i]放的是第i位
        int count0 = 0;
        String ans ="";
        for (int i = 0; i < length; i++) {
            num[length - i] = mon.charAt(i) - 48;
        }
//        下面代码对于只有一个0的情况无法处理,因此这样if
//        语句单独判断一下
        if(mon.equals("0")){
            System.out.print("a");
        } else {
//        先输出出现亿位的情况
        if(length == 9){
            ans += lit[num[9]] + "Y";
            length -= 1;
        }
        if (length > 4 && length < 9){
//            for循环输出万位的情况
            for (int i = length ; i > 4; i--) {
//                遇到数字为0的情况要不输出单位
//                如果全是0,那么不输出W
                if(num[i] != 0){
                    ans += lit[num[i]] + uni[i-5];
//               如果这四位中后面全是0,则直接跳过输出W
                    for (int j = i; j > 5; j--) {
                        if (num[j-1] == 0){
                            count0 += 1;
                        }
                    }
                    if(count0 == i - 5){
                        break;
                    }
                    count0 = 0;
                } else {
//                    如果0前面还是0,那么这个0不输出
                    if(num[i + 1] != 0){
                        ans += lit[num[i]];
                    }
                    count += 1;
                }
            }
            if (count != 4){
                ans += "W";
            }
//            用于传递到下一级单位
            if (length == 8){
                length -= 4;
            } else {
                length -= length % 4;
            }
        }
        count0 = 0;
        if (length > 0 && length < 5){
//            for循环输出个位的情况
            for (int i = length ; i > 0; i--) {
//                遇到数字为0的情况要不输出单位
                if(num[i] != 0){
                    ans += lit[num[i]] + uni[i-1];
//                    如果这四位中后面全是0,则直接跳过
                    for (int j = i; j > 1; j--) {
                        if (num[j-1] == 0){
                            count0 += 1;
                        }
                    }
                    if(count0 == i - 1){
                        break;
                    }
                    count0 = 0;
                } else {
//                    如果0前面还是0,那么这个0不输出
                    if(num[i + 1] != 0 || i == 4){
                        ans += lit[num[i]];
                    }
                }
            }
        }
//        最后消灭掉尾巴上的0
        char[] check = new char[ans.length()+1];
        for (int i = 0; i < ans.length(); i++) {
            check[i] = ans.charAt(i);
        }
        int newLength = ans.length();
        for (int i = ans.length() - 1; i > 0; i--) {
            if(check[i] == 'a'){
                newLength -= 1;
            } else {
                break;
            }
        }
        System.out.println(ans.substring(0,newLength));
    }
}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值