大数相乘问题(java版)

来源:互联网 发布:理肤泉b5真假知乎 编辑:程序博客网 时间:2024/05/16 09:59

将两个大数保存到字符串中,他们相乘的结果也保存到字符串中,那么无论多大的数,都能够用这种方法去解决。

首先看下我们数学上怎么去计算两个数字相乘的:
这里写图片描述

如果我们用程序把上面的过程写出来,那么这个问题就解决了。

java代码如下:

package com.zyk.model;import java.util.Scanner;public class BigNumMuti {    public static void main(String[] args) {        Scanner can = new Scanner(System.in);        try{            String line1 = can.nextLine().trim();            String line2 = can.nextLine().trim();            String result = multiBigInteger(line1,line2);            System.out.println(result);        }finally{            can.close();        }    }    public static String multiBigInteger(String num1, String num2)    {         //字符串的长度        int num1Len = num1.length();        //num1的长度        int num2Len = num2.length();       //num2的长度        int i, j, k;                       //循环计数器         int res;                           //每次一位相乘/相加的结果        int carry = 0;                     //进位        int offset = 0;                    //加法的偏移位        //每次相乘的结果        int tempResLen = num1Len;                   //每次相乘结果的最大长度 ,每次num1乘以num2每一位的结果最大长度是num1Len+1,由于下标从0开始,所以减一后约去1,只剩num1Len        char[] tempRes = new char[tempResLen+2];              //用来保存每次相乘的结果        //最终结果        //结果的最大长度        int resultLen = num1Len + num2Len - 1; //结果长度最大为num1长度和num2长度之和,由于下标从0开始,所以要减一        char[] result =  new char[resultLen+1];        for(j = num2Len - 1; j >= 0; j--)        {            for(i = num1Len-1; i >= 0; i--)            {                res = Integer.parseInt(num1.charAt(i) + "") * Integer.parseInt(num2.charAt(j) + "")  + carry;                tempRes[tempResLen--] = toChar(res % 10);// 把结果的个位放在结果集里面                carry = res / 10;//得到结果集进入的数            }            //乘数的最后一位数与被乘数的一个数字想成的进位没有算            //tempRes第一位为进位,刚刚的循环是没有算的,最后把进位算上            tempRes[tempResLen] = toChar(carry);            tempResLen = num1Len;            carry = 0;            //乘数与被乘数的一位数乘完后,与之前的数字相加            //由result的末尾开始计算和,算完一次,向左偏移一位            for(k = resultLen-offset; k > (resultLen-offset-num1Len); k--)            {                res = toInt(result[k]) + toInt(tempRes[tempResLen--]) + carry;                result[k] = toChar(res%10);                carry = res/10;            }            //最后一个相加数的进入            result[k] = toChar(toInt(result[k]) + toInt(tempRes[tempResLen]) + carry);            carry = 0;            tempResLen = num1Len;            offset++;        }        String str = new String (result);        while (str.startsWith("0")) {            str = str.substring(1);        }        return str;    }    public static char toChar(int c){        return String.valueOf(c).charAt(0);    }    public static int toInt(char c){        try {            return  Integer.valueOf(c + "");        } catch (Exception e) {            return 0;        }    }}