广发银行春招编程

求A的B次方末尾三位数

问题描述

任意输入两个整数A、B,A、B取值区间为[1000,100000], 求AB的3位尾数(百十个位)。

示例

输入:2000,1111
输出: "000"

思路

这题是真他娘的坑。输出示例中,“000”,引号千万别忘了= =。
而且这题还有个坑点,输出一定要是三位的。这也就意味着你如果用%得到的后3位,第一位是0的话,输出的时候就不够3位了。所以要机智处理。
其余的倒没啥了。直接拿中间结果的最后三位与base值相乘即可,因为列个竖式就知道了,最后三位的值取决于最后三位相乘,为啥不全部相乘呢,还省事儿。因为不这样的话会溢出,数据范围太大了。

AC代码

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int base, exp;
        String[] tmp;
        tmp = scanner.nextLine().split(",");
        base = Integer.parseInt(tmp[0]);
        exp = Integer.parseInt(tmp[1]);
        long res = base%1000;
        for(int i = 1; i < exp; i++){
            res = (res * base) % 1000;
        }
        System.out.printf("\"%03d\"",res);
    }
}

中文数字转为阿拉伯数字

问题描述

请实现一个中文数字转换程序。
输入一个中文数字,转换为阿拉伯数字,在1,0000,0000,0000以内(不包含)。
中文由这些字符构成:零、一、二、三、四、五、六、七、八、九、十、百、千、万、亿。

示例

一百六十三
163

思路

先分析数据范围。最大的数就是九千九百九十九亿九千九百九十九万九千九百九十九了。
先考虑这种情况的:不用考虑亿、万、千、百、十。忽略掉他们,留下的数字直接变为阿拉伯数字即可。
然而,想一下。两亿。这种情况咋办?直接变,怕是不行。所以我们要分段处理。
多少多少亿是一段,多少多少万是一段。剩余的是一段。
用split分好段之后,三段都是1000以内的,所以可以按照相同的规则进行处理了。
比如一千零三。 我们可以一次读两个字符,读到一千,把一和千乘起来。读到零则跳过,如果一次读不了两个字符,且这个字符不是零,则不能跳过,这是单个字符,直接相加。 以上处理过程会得到一个中间结果。如果是第一段,证明是多少亿,乘以亿即可。 如果是第二段,乘以万即可。

AC代码

class Solution{
    public String convert(String number){
        String[] numbers = new String[3];
        if(number.split("亿").length == 1){
            if(number.charAt(number.length()-1) == '亿'){
                // 尾部是亿的情况
                numbers[0] = number.split("亿")[0];
                numbers[1] = "";
                numbers[2] = "";
            }else{
                // 不含亿的情况
                numbers[0] = "";
                numbers[1] = number;
                numbers[2] = "";
            }
        }else{
            // 亿在中间的情况
            numbers[0] = number.split("亿")[0];
            numbers[1] = number.split("亿")[1];
            numbers[2] = "";
        }
        if(numbers[1].split("万").length == 1){
            if(numbers[1].length()>0 && numbers[1].charAt(numbers[1].length()-1) == '万'){
                // 如果万是结尾
                numbers[1] = numbers[1].split("万")[0];
                numbers[2] = "";
            }else if(numbers[1].length() > 0){
                // 不含万的情况
                numbers[2] = numbers[1];
                numbers[1] = "";
             }else{
                // numbers[1]为空的情况
                numbers[1] = "";
                numbers[2] = "";
            }
        }
        System.out.println(Arrays.toString(numbers));
        Map<Character,Integer> map = new HashMap<>();
        map.put('一',1);
        map.put('二',2);
        map.put('三',3);
        map.put('四',4);
        map.put('五',5);
        map.put('六',6);
        map.put('七',7);
        map.put('八',8);
        map.put('九',9);
        map.put('零',0);
        map.put('十',10);
        map.put('百',100);
        map.put('千',1000);
        map.put('万',10000);
        map.put('亿',100000000);
        long res = 0;
        for(int i = 0; i < 3; i++){
            if(numbers[i].equals("")){
                continue;
            }
            long curRes = 0;
            int j = 0;
            while(j < numbers[i].length()){
                if(numbers[i].charAt(j) == '零'){
                    j++;
                }else if(j < numbers[i].length()-1){
                    curRes += map.get(numbers[i].charAt(j))*map.get(numbers[i].charAt(j+1));
                    j += 2;
                }else{
                    curRes += map.get(numbers[i].charAt(j));
                    j++;
                }
            }
            if(i == 0){
                curRes *= map.get('亿');
            }else if(i == 1){
                curRes *= map.get('万');
            }
            res += curRes;
        }
        return String.valueOf(res);
    }
}
发布了433 篇原创文章 · 获赞 21 · 访问量 3万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览