java面试题,输入一串数字,输出大写金额,如123 输出壹佰贰拾叁整。

今天面试了一家公司,面试的Java初级开发,实习的岗位。面试题也都挺简单的,给了四道题,让我挑一道做。我就选了第一道:
输入一串数字,输出其大写金额,
如:123
输出:壹佰贰拾叁整

之前一直在搞自己的服务器,外加一个月没碰java了,在准备考公务员,面试的时候突然发现自己啥都忘了,差点连最基础的Scanner都写不出了。

现在回来我好好写一下这个代码,当时在哪里只写到了万位以后的

让我们来先分析一下

输出大写金额,这个第一个想到的就是switch-case

然后就是数位,举个例子123
我们要输出壹佰贰拾叁,那就要从左到右,先是壹,百位,二,十位,三,整
这就需要我们判断一次数字在判断一下数位,
再来个例子,10000和10086
我们这次要输出壹万整 和 壹万零捌拾陆整
这个逻辑就是我们要判断 :
if(前一个数字是否为零&&当前数字不为零){
输出(“零”+数字+数位)
}
输出数字;
输出数位;

下面我们代码实现这个逻辑

 /**
     * 输入一串数字,输出大写金额,如123 输出壹佰贰拾叁整。
     * 
     * @param args
     */
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一串数字");
        String num = input.nextLine();
        // for循环中尽量不要用String +=的方式拼接,可以用StringBuilder
        boolean perviousIsZero = false;
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < num.length(); i++) {
            int a = num.charAt(i);
            // 判断当前是否为零
            if (a == 48) {
                perviousIsZero = true;
                continue;
            }

            // 判断数字前一个是否是零且当前数字不为零
            if (perviousIsZero) {
                if (a != 48) {
                    stringBuilder.append("零");
                    perviousIsZero = false;
                } else {
                    // 都是零就跳过
                    continue;
                }
            }

            // 获取数字大写
            stringBuilder.append(getUpperCase(a));
            // 获取数位
            stringBuilder.append(getDigitPlace(num.length() - i));
        }
        System.out.println(stringBuilder.toString() + "整");
    }

    /**
     * 获取数位
     * 
     * @param i
     * @return
     */
    private static String getDigitPlace(int i) {
        switch (i) {
        case 2:
        case 6:
        case 10:
            return "拾";
        case 3:
        case 7:
        case 11:
            return "佰";
        case 4:
        case 8:
        case 12:
            return "仟";
        case 5:
        case 13:
            return "万";
        case 9:
            return "亿";
        default:
            return "";
        }
    }

    /**
     * 输出数字的大写
     * 
     * @param a
     * @return
     */
    private static String getUpperCase(int a) {
        switch (a) {
        case 49:
            return "壹";
        case 50:
            return "贰";
        case 51:
            return "叁";
        case 52:
            return "肆";
        case 53:
            return "伍";
        case 54:
            return "陆";
        case 55:
            return "柒";
        case 56:
            return "捌";
        case 57:
            return "玖";
        default:
            return "";
        }
    }

我们运行一下看看
12341000010080
输出都正常,那我们看看长一点的
12345678912345
这里十万亿位出现了错误,是因为我们switch case只写到了第13位数,超出
了我们默认就没有数位了。所以这里还有地方可以优化。



这里单位有问题,不应该用万亿这个单位,千亿后面就是兆了,所以一般差不多计算到千亿就可以了,再往后就没太大意义了

其实做这个题的时候发生了两件挺尴尬的事情,我第一眼看到这个题的时候,我还以为只是要把数字转成大写形式,没注意是要有数位,还对面试官说这第一题太简单,我可以把顺便第一道做了后再做一道题(本来是四选一的题)。

结果发现自己眼瞎,其实逻辑还是要想一想的,外加一个月没碰java(之前都在搞自己的服务器和 搞数据清洗)我差点连Scanner都忘记怎么写了,还好面试官当时有事离开了一会,我在这一行Scanner这就卡了几分钟。后来面试官到时间了过来看了看我,发现我还没写好,我当时真的尴尬到头晕,没开玩笑,是真的头晕了,看代码都在晃的那种。

总结了下,现在发现自己的基础真的差呀,这最基本的都能忘记。现在还是在把基础多练练,不然都生疏了。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值