记录一下今天招聘中碰到的笔试题——十进制转十六进制,大整数相乘

1、实现将10进制数字字符串转换为16进制数字字符串。如“155”,输出“0x9B”。要求不得使用任何第三方提供字符串与数字转换方法,如C语言的atoi,Java的String.ParseInt等等。

/**
 * 十进制转十六进制
 */
public class Decimal2Hex {

    public static String decimal2Hex(String num) {
        BigDecimal decimal = new BigDecimal(num);
        StringBuilder sb = new StringBuilder();

        char[] hexs = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        BigDecimal decimal16 = new BigDecimal(16);

        //除16取余过程,直到被除数为0
        while (decimal.compareTo(BigDecimal.ZERO) != 0) {
            //除16取余
            sb.append(hexs[decimal.remainder(decimal16).intValue()]);
            //除以16不进位
            decimal = decimal.divide(decimal16, 0, BigDecimal.ROUND_DOWN);
        }
        //当传入的值为0时,直接返回0x00
        if(sb.length() == 0) {
            return "0x00";
        }
        //计算结果只要一位时,补一位0
        if(sb.length() == 1) {
            sb.append('0');
        }

        //倒置字符串
        return "0x" + sb.reverse().toString();

    }
}

2、随机给定两个超大整数,实现计算两数之乘积。如“111111111111111”和“222222222222222”,输出乘积“24691358024691308641975308642”。要求不使用Java中的BigInteger等类

/**
 * 大整数相乘
 */
public class BigIntMultiply {

    public static String multiply(String num1, String num2) {

        //将字符串转为int数组
        int[] num1Arr = string2IntArray(num1);
        int[] num2Arr = string2IntArray(num2);

        //保存结果
        int[] result = new int[num1Arr.length + num2Arr.length];

        //按位依次相乘,并且存入数组对于的位置
        for (int i = 0; i < num1Arr.length; i++) {
            for (int j = 0; j < num2Arr.length; j++) {
                result[i + j + 1] += num1Arr[i] * num2Arr[j];
            }
        }

        //处理进位
        for (int i = result.length - 1 ; i > 0; i--) {
            if(result[i] > 10) {
                result[i - 1] += result[i] / 10;
                result[i] %= 10;
            }
        }

        //将结果转为String
        return intArray2String(result);
    }

    private static int[] string2IntArray(String s) {
        int[] res = new int[s.length()];

        int i = 0;
        for(char c: s.toCharArray()) {
            res[i++] = c - '0';
        }
        return res;
    }

    private static String intArray2String(int[] arr) {
        StringBuilder sb = new StringBuilder();
        //如果首位是0,将0去掉
        if(arr[0] != 0) {
            sb.append(arr[0]);
        }
        for (int i = 1; i < arr.length; i++) {
            sb.append(arr[i]);
        }
        return sb.toString();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值