大数相乘问题

大整数乘法实现
本文介绍了一种处理超出标准整型数据范围的大整数乘法的方法。通过两种不同的技术实现:一是手动逐位相乘并处理进位,二是利用Java的BigInteger类简化操作。

题目描述:输入两个整数,要求输出这两个数的乘积。输入的数字可能超过计算机内整形数据的存储范围。

思路:

方法1:
1. 将乘数与被乘数逐位相乘;
2. 将逐位相乘得到的结果,对应相加起来。
3. 可以先不考虑进位,当所有位对应相加,产生结果之后,再考虑如果该位的数字大于10,那么我们用取余运算,在该位上只保留取余运算的结果,而将进位(通过模运算得到)累加到下一位便可。

方法2:
使用BigInteger类来处理大数据。

import java.util.Scanner;

public class TwoBigNumMulti {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("input num1:");
        String s1 = sc.nextLine();
        System.out.println("input num2");
        String s2 = sc.nextLine();
        int[] num1 = new int[s1.length()];
        int[] num2 = new int[s2.length()];
        for(int i=0;i<s1.length();i++){
            num1[s1.length()-i-1] = s1.charAt(i) - '0'; // "12345"-> 5,4,3,2,1
        }
        for(int i=0;i<s2.length();i++){
            num2[s2.length()-i-1] = s2.charAt(i) - '0';
        }
        int[] result = multi(num1, num2);
        for(int i=result.length-1;i>=0;i--){
            System.out.print(result[i]);
        }

    }
    public static int[] multi(int num1[], int num2[]){
        int len1 = num1.length;
        int len2 = num2.length;
        int[] result = new int[len1 + len2];
        for(int i=0;i<len1;i++){
            for(int j=0;j<len2;j++){
                result[i+j] += num1[i]*num2[j];
            }
        }
        for(int i=0;i<result.length-1;i++){
            if(result[i] > 10){
                result[i+1] += result[i]/10;
                result[i] %= 10;
            }
        }
        return result;
    }

}

方法2:

package Alex.Huawei.Test;

import java.math.BigInteger;
import java.util.Scanner;

public class TwoBigNumMulti {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("input num1:");
        String s1 = sc.nextLine();
        System.out.println("input num2");
        String s2 = sc.nextLine();
        BigInteger b1 = new BigInteger(s1);
        BigInteger b2 = new BigInteger(s2);
        BigInteger result = multi1(b1, b2);
        System.out.println(result.toString());

    }

    public static BigInteger multi1(BigInteger b1, BigInteger b2){
        return b1.multiply(b2);
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值