大数相乘

来源:互联网 发布:鹰潭三缺一麻将软件 编辑:程序博客网 时间:2024/06/09 21:09

需求:

有两个大数A,B,位数分别为a和b,求其乘积 ,以字符串的形式返回。

分析:

对于大数乘法,直接使用运算符*得到的结果有可能溢出,因此模拟乘法的运算步骤进行求解。

假设A=a3a2a1a0,B=b2b1b0,结果是int[] result = new int[A.length+B.length]。计算二者乘积的时候,需要逐个遍历A和B的每个数字。将字符串A和B翻转,A[i]和B[j]乘积对应着结果的[i+j],需要更新进位值和结果值。比如A[1]*B[1]对应result[2],并且在result[2]中对应的值是(carry+A[1]*B[1])%10,更新进位carry。最初实现功能的时候参数是long型,但是long型数据也是有限的,因此用字符串来代替,经过证实,可以计算大数的乘法。

代码:

/* * 计算两大数A,B乘积,以字符串形式返回 * */class BigDataMul{//计算两大数乘积public static String bigDataMul(String A, String B){//将两大数转成字符串并翻转String s1 = new StringBuilder(A).reverse().toString();String s2 = new StringBuilder(B).reverse().toString();//创建结果数组int[] result = new int[s1.length()+s2.length()];//数组的最大长度就是两字符串的长度之和int carry = 0;//初始化进位值0//遍历两个字符串,更新结果for(int j = 0; j < s2.length(); j++){int i = 0;for(; i < s1.length(); i++){carry += (s1.charAt(i) - '0')*(s2.charAt(j) - '0');result[i+j] += carry % 10;carry /= 10;}//如果进位值不是0,应该进行累加if(carry != 0){result[i+j] += carry;carry = 0;}}//更新result数组for(int i = 0; i < result.length; i++){carry += result[i];result[i] = carry % 10;carry /= 10;}//去除result数组中个多余的0StringBuilder sb = new StringBuilder();int count = result.length-1;//从后向前找不是0的角标,即乘积的有效位for(; count >= 0; count--){if(result[count] != 0){break;}}//如果count>=0,说明0-count是有效位if(count >= 0){//将结果存到缓冲区中for(int i = count; i >= 0; i--){sb.append(result[i]);}}else{//如果count<0,说明结果是0return 0+"";}return sb.toString();}public static void main(String[] args){String A = "12345678900987654321", B = "12345678900987654321";System.out.println(A+"*"+B+" = "+bigDataMul(A, B));}}

public class Solution {    /*     * @param num1: a non-negative integers     * @param num2: a non-negative integers     * @return: return product of num1 and num2     */    public String multiply(String num1, String num2) {        // write your code here        //将num1和num2翻转转成字符串        String s1 = new StringBuilder(num1).reverse().toString();        String s2 = new StringBuilder(num2).reverse().toString();                //创建整型数组,存储结果        int[] result = new int[num1.length()+num2.length()];                int carry = 0;//初始化进位值0                //遍历两个字符串,计算乘积        for(int i = 0; i < s1.length(); i++){            int j = 0;            for(; j < s2.length(); j++){                carry += (s1.charAt(i)-'0')*(s2.charAt(j)-'0');                result[i+j] += carry % 10;                carry /= 10;            }                        //如果进位不是0,需要进位            if(carry != 0){                result[i+j] += carry;                carry = 0;            }        }                //更新result数组,进位处理        for(int i = 0; i < result.length; i++){            carry += result[i];            result[i] = carry % 10;            carry /= 10;        }                //去除result中多余的0        int count = result.length-1;        for(; count >= 0; count--){            if(result[count] != 0){                break;            }        }                StringBuilder sb = new StringBuilder();        //当count>=0时,有效位是0到count        if(count >= 0){            for(int i = count; i >= 0; i--){                sb.append(result[i]);            }        }        else{            return 0+"";//当count<0时,说明result中全都是0,直接返回0        }                return sb.toString();    }}