k6k4刷题--大整数相乘

题目链接: http://www.k6k4.com/code/qshow/aannamwyg1509274910235

两个大整数相乘容易溢出,现将整数用字符数组表示,模拟整数相乘的过程。
如两个整数字符数组表示为: 
a = new char[]{'1', '9', '9'},
b = new char[]{'2', '9', '9', '9', '9'}, 
结果为:c = new char[]{'5', '9', '6', '9', '8','0','1'}。 注:大整数首位不能为0
输入、输出描述
输入:
两个大整数的字符串表示形式,排列从高位到地位,如321 的数组表示形式:new char[]{'3', '2', '1'}
输出:
两个大整数相乘结果的字符数组表示形式,首位不能为0
Example
输入:
a = new char[]{'1', '9', '9'}
b = new char[]{'2', '9', '9', '9', '9'}
输出:
c = new char[]{'5', '9', '6', '9', '8','0','1'}


---------------------华丽分割线-----------------------

解题思路:

采用两层for循环,按照正常乘法计算方法,从低位数字开始循环,注意这里低位对应的是数组的高位。具体方法可以参考代码里的注释。

    import java.util.*;
     
    public class Main {
        public char[] solution(char[] a,char[] b) {
    		int length1 = a.length;
    		int length2 = b.length;
    		//两数相乘结果的长度不会超过两数位数之和,可以创建如下数组保存中间计算结果
    		int[] temp = new int[length1+length2];
    		//按照正常乘法计算方法,从低位开始循环,对应数组的高位
    		//第一个数按位循环
            for(int i=0;i<length1;i++) {
                //得到最低位的数字
                int num1=a[length1-1-i]-'0';
                //保存进位
                int tmp=0;
                //第二个数按位循环
                for(int j=0;j<length2;j++) {
                    int num2=b[length2-1-j]-'0';
                    //拿出此时的结果数组里存的数+现在计算的结果数+上一个进位数
                    tmp=temp[i+j]+num1*num2+tmp;
                    //得到此时结果位的值
                    temp[i+j]=tmp%10;
                    //此时的进位
                    tmp/=10;
                }
                //第一轮结束后,如果有进位,将其放入到更高位
                temp[i+length2]=tmp;
            }
            
            int resultLength = length1+length2-1;
            while (resultLength>0 && temp[resultLength]==0) {
    			resultLength--;
    		}
            char[] result = new char[resultLength+1];
            int index = 0;
            while (resultLength>=0) {
    			result[index] = (char) (temp[resultLength--]+'0');
    			index++;
    		}
     
    		return result;
        }
    }

欢迎加“算法刷题交流QQ群(474397739)”一起研究讨论算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值