java 实现两个大位数相乘

本文介绍了两种实现大数乘法的方法:一是使用Java内置的BigInteger类中的multiply()方法;二是通过自定义算法,利用Map存储高位和低位,实现两个大数的相乘。详细解释了如何将字符串形式的大数转换为Map结构,以及如何通过遍历和计算得到最终的乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)用Java内部实现的BigInteger里面的函数multiply();

        Scanner sc=new Scanner(System.in);
        String s1=sc.nextLine();
        String s2=sc.nextLine();
        BigInteger a =new BigInteger(s1);
        BigInteger b =new BigInteger(s2);
        BigInteger c=a.multiply(b); 

(2)基于平时计算乘法的步骤,用map存储每个位相乘后的结果。

import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
    public  static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        String s1=sc.nextLine();
        String s2=sc.nextLine();
        Map<Integer,Integer> n1=new HashMap<Integer,Integer>();//存放第一个
        Map<Integer,Integer> n2=new HashMap<Integer,Integer>();//存放第二个
        Map<Integer,Integer> result=new HashMap<Integer,Integer>();//存放结果
        //将s1和s2放到n1和n2中
        n1=makeBigInteger(s1);
        n2=makeBigInteger(s2);
        //将两个计算
        result= mult(n1,n2);
        //算出结果
        System.out.println(getResult(result));

    }
    //该函数将高位和低位分别存到key和value中
    public  static Map<Integer,Integer> makeBigInteger(String s){
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();
        int len=s.length();
        for(int i=1;i<=s.length();++i){
            map.put(len--,Integer.parseInt(s.substring(i-1,i)));
        }
        return map;
    }
    //将两个大数map进行相乘
    public static Map<Integer,Integer> mult(Map<Integer,Integer> p1,Map<Integer,Integer> p2){
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();
        for(int j=1;j<=p1.size()+p2.size();++j){
            map.put(j,0);
        }
        for(int i=1;i<=p1.size();++i){
            for(int k=1;k<=p2.size();++k){
                int num=k+i-1;  //就是位数,个位数,十位数,百位数...

                int result=p1.get(i) * p2.get(k);   //获取相乘的结果

                if(result/10==0){
                    add(num,result,map);//未进位处理
                }else {
                    add(num,result%10,map);//将余数写入当前位数
                    add(num+1,result/10,map);//将进位的数写入上一个位数,并且存入map
                }
            }
        }
        return map;
    }
    //解决数字相加后大于9的进位问题
    public static void add(int num,int result,Map<Integer,Integer> map){
        int r=map.get(num)+result;//该map 是新生的map,value全是0
        if(r/10==0){    //未进位,直接放进去
            map.put(num,r);
        }else{      //进位
            map.put(num,r%10);  //将进位的余数写入当前位数
            add(num+1,r/10,map);    //将进位的数写入上一个位数,并且存入map
        }
    }
    //将result的map转化为String输出
    public static  String getResult(Map<Integer,Integer> map){
        String result="";
        for(int i= map.size(); i>=1;i--){
            if(map.get(i) == 0 && result.equals("")){}
            else{
                result += map.get(i) + "";
            }
        }
        return result;
    }
}

 

<think>好的,我现在需要回答用户关于整数相加和相乘实现方法的问题。首先,用户已经提供了三个引用资料,我需要仔细阅读这些资料,理解其中的算法思路,并结合自己的知识来整理出清晰的步骤和代码示例。 首先看引用[1],它提到使用unsigned数组来存储乘数和结果,相乘的最位数是400位。计算过程类似于竖式乘法,但进位处理放在后面统一进行。引用[2]是C++的实现,说明了字符串处理的方式,逐位相乘并存储到正确的位置,然后处理进位。引用[3]是Java代码,将字符串转置为数组,相乘相加后再转置输出。 用户的需求是实现整数相加和相乘的算法或代码示例,我需要综合这些信息,给出清晰的步骤和示例代码。 对于整数相加,通常的步骤是将两个数字字符串逆序,然后逐位相加,处理进位。例如,字符串"123"和"456"逆序后为[3,2,1]和[6,5,4],逐位相加得到[9,7,5],再逆序得到"579"。要注意进位的情况,比如相加某一位超过10时,进位到高位。 整数相乘的步骤则更复杂。根据引用[2]和[3],需要将两个数字逆序存储为数组,然后每一位相乘,结果存放在对应的位置。例如,str1的第i位和str2的第j位相乘,结果应该存放在i+j的位置。之后统一处理进位,最后再将结果逆序输出。例如,计算12*34,逆序后是[2,1]和[4,3],相乘得到各个位置的和,处理后得到[8, 11, 3],进位后变成[8, 1, 4],逆序得到408。 在代码实现方面,相加部分可以用Python的列表来存储各位数字,逆序后逐位相加,处理进位。相乘则需要两层循环遍历每一位,累加到结果数组的对应位置,再处理进位。需要注意的是,结果的位数最多是两数位数之和,所以数组长度要足够。 现在需要验证这些步骤是否正确,例如相加和相乘的进位处理是否正确,数组索引是否正确。比如在相乘时,i和j的索引对应结果数组的i+j的位置,这符合竖式乘法的规则。处理进位时,需要从低位到高位依次处理,每位取模和整除来更新当前位和下一位的值。 对于代码示例,需要确保语法正确,并且符合用户提供的引用中的逻辑。Python的实现可能需要将字符串转换为整数列表,逆序处理,然后进行计算,最后再逆序合并成字符串。 最后,要生成相关问题,帮助用户深入理解。比如询问如何处理负数,优化方法,或者不同编程语言的实现差异等。</think>### 整数相加与相乘实现方法 #### **一、整数相加** **实现思路**: 1. 将输入字符串逆序存储为数字数组(便于从低位开始计算) 2. 逐位相加并处理进位 3. 结果逆序后转换为字符串 **Python代码示例**: ```python def bigint_add(num1, num2): # 逆序存储为数字列表 a = list(map(int, num1[::-1])) b = list(map(int, num2[::-1])) max_len = max(len(a), len(b)) + 1 result = [0] * max_len # 逐位相加 for i in range(max_len): sum_val = result[i] if i < len(a): sum_val += a[i] if i < len(b): sum_val += b[i] result[i] = sum_val % 10 if i < max_len - 1: result[i+1] += sum_val // 10 # 进位处理 # 去除前导零并逆序 while len(result) > 1 and result[-1] == 0: result.pop() return ''.join(map(str, result[::-1])) ``` --- #### **二、整数相乘** **实现思路**: 1. 将输入字符串逆序存储为数字数组 2. 双重循环遍历每一位,乘积累加到结果数组的对应位置 3. 统一处理进位 4. 结果逆序后转换为字符串 **Python代码示例**: ```python def bigint_multiply(num1, num2): if num1 == "0" or num2 == "0": return "0" # 逆序存储为数字列表 a = list(map(int, num1[::-1])) b = list(map(int, num2[::-1])) result = [0] * (len(a) + len(b)) # 逐位相乘累加 for i in range(len(a)): for j in range(len(b)): result[i+j] += a[i] * b[j] # 核心逻辑:i+j位置累加 # 统一处理进位 for i in range(len(result)-1): if result[i] >= 10: result[i+1] += result[i] // 10 result[i] %= 10 # 去除前导零并逆序 while len(result) > 1 and result[-1] == 0: result.pop() return ''.join(map(str, result[::-1])) ``` --- #### **关键逻辑说明** 1. **逆序存储**:字符串转数字数组时逆序,如`"123"`转为`[3,2,1]`,方便从个位开始计算[^2][^3]。 2. **进位处理**:相加时直接逐位处理进位,相乘时统一处理进位,避免多次递归操作[^1]。 3. **乘积位置**:数字的第`i`位和第`j`位相乘,结果存放在数组的`i+j`位置,与竖式乘法原理一致[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值