利用数组实现获取俩个大整数相乘结果.

1.先看俩个数字是怎么相乘

第一步为每个数字对应相乘,第二步为对应相加 ,第三步为进位.

第一步中数字相乘相当于数组中每个数字对应相乘,并保存到相应的位置里面去.第二步对应相加是把第一步的结果相加保存,第三步则是进行进位处理,当前位置数字超过10则进位,进位原理为当前数字%10 保存到下一位置里面.

具体实现代码如下

    public static void main(String[] args){
        String  result = getResult("999999999999999999","8888888888888888888");
        System.out.println(result);
    }

    /**
     * 获取俩个大数相乘
     * @param num1
     * @param num2
     * @return
     */
    public static String getResult(String num1, String num2) {
        //转换成int数组
        int aArray[] = getStringArray(num1);
        int bArray[] = getStringArray(num2);
        int result[] = new int[num1.length() + num2.length()];
        //数组对应位数相乘并保存
        for(int i = 0 ; i < aArray.length ;i++){
            int aTempNum = aArray[i];
            for(int j = 0 ;j < bArray.length ; j++){
                int bTempNum = bArray[j];
                int cTempNum = result[i+j];
                cTempNum = cTempNum +  aTempNum * bTempNum;
                result[i + j] = cTempNum;
            }
        }
        //进位,最后一位一定是0-9,不需要进位操作!!!!
        for(int i = 0; i < result.length - 2 ; i++){
            int a = result[i]%10;
            int b = result[i]/10;
            result[i] = a;
            result[i + 1] = result[i + 1] + b;
        }
        //拼接最终结果,结果记得倒序拼接
        String resultStr  = "";
        for(int i = result.length - 1; i >= 0 ; i--){
            if(i < result.length - 1){
                resultStr = resultStr + result[i];
            }else if(i == result.length - 1 && result[result.length - 1] > 0){
                //去除首位0时也进行拼接操作
                resultStr = resultStr + result[i];
            }
        }
        return resultStr;
    }

    /**
     * String 转换成int数组
     * @param str
     * @return
     */
    public static int[] getStringArray(String str){
        int date[] = new int[str.length()];
        char[] temp = str.toCharArray();
        for(int i = 0 ;i<= str.length() - 1 ; i++){
            String tempStr = String.valueOf(temp[str.length() - 1 - i]);
            date[i] = Integer.parseInt(tempStr);
        }
        return date;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值