Java实现大整数乘法

Java实现大整数乘法1问题描述计算两个大整数相乘的结果。2解决方案2.1蛮力法packagecom.liuzhen.chapter5;importjava.math.BigInteger;publicclassBigNumber{/**参数A:进行乘法运算的大整数A,用字符串形式表示*参数B:进行乘法运算的另一个大整数B,用字符串形式表示…

大家好,又见面了,我是你们的朋友全栈君。

1 问题描述
计算两个大整数相乘的结果。

2 解决方案
2.1 蛮力法

package com.liuzhen.chapter5;

import java.math.BigInteger;

public class BigNumber {
    /*
     * 参数A:进行乘法运算的大整数A,用字符串形式表示
     * 参数B:进行乘法运算的另一个大整数B,用字符串形式表示
     * 函数功能:以字符串形式返回A*B的结果
     */
    public String getMultiBigNumber(String A,String B){
        if(A.length() > B.length()){       //当B字符串长度小于A时,在B字符串前补0,使得两个字符串长度一致
            char[] temp = new char[A.length()-B.length()];
            for(int i = 0;i < A.length() - B.length();i++)
                temp[i] = '0';
            B = String.valueOf(temp) + B;
        }
        if(A.length() < B.length()){      //当A字符串长度小于B时,在A字符串前补0,使得两字符串长度一致
            char[] temp = new char[B.length()-A.length()];
            for(int i = 0;i < B.length() - A.length();i++)
                temp[i] = '0';
            A = String.valueOf(temp) + A;
        }
        
        int len = A.length() + B.length();
        
        char[] arrayA = A.toCharArray();
        char[] arrayB = B.toCharArray();
        for(int i = 0;i < arrayA.length;i++)     //检查字符串A中是否有非数字的字符
            if(arrayA[i] < '0' || arrayA[i] > '9')
                return null;
        for(int i = 0;i < arrayB.length;i++)    //检查字符串B中是否有非数字的字符
            if(arrayB[i] < '0' || arrayB[i] > '9') 
                return null;
        
        char[] result = new char[len];    //用于存放最终乘法运算结果,长度len表示A*B的最长长度
        for(int i = 0;i < len;i++)         //初始化字符数组result,各个元素均为'0'
            result[i] = '0';
        
        int countI = 0;       //用于计算当前B中已经和A中每个字符进行完乘法运算的字符个数    
        for(int i = arrayB.length-1;i >= 0;i--){
            int tempB = arrayB[i] - '0';
            int countJ = 0;   //用于计算当前A中正在进行乘法运算的字符个数
            for(int j = arrayA.length - 1;j >= 0;j--,countJ++){
                int tempA = arrayA[j] - '0';
                int tempRe = (tempB * tempA) % 10;  //用于计算当前位置的数
                int tempResult = result[(len-1-countJ)-countI] - '0';  //当前位置已包含的结果
                tempResult += tempRe;
                //count--表示当前A字符串中进行乘法运算的字符位置,countI表示当前B字符串中进行乘法运算的字符位置
                //(count--)-countI则表示当前进行乘法运算两个数字结果的最低位的位置
                result[(len-1-countJ)-countI] = (char) (tempResult%10 + 48); //当前位置数最终结果
                
                int tempDi = tempB * tempA / 10 + tempResult / 10;       //用于计算进位
                for(int k = 1;tempDi > 0;k++){   //处理进位操作
                     //当前下第k个位置包含的结果
                    int tempResultK = result[(len-1-countJ)-countI-k] - '0'; 
                    tempResultK += tempDi;
                    result[(len-1-countJ)-countI-k] = (char) (tempResultK%10 + 48);
                    tempDi = tempResultK / 10;
                }
            }
            countI++;
        }
        
        return getNoneZeroString(result);
    }
    
    //去掉字符串前面的0
    public String getNoneZeroString(char[] result){
        int count = 0;
        for(int i = 0;i < result.length;i++){
            if(result[i] == '0')
                count++;
            else
                break;
        }
        char[] A = new char[result.length-count];
        for(int i = 0;i < result.length-count;i++)
            A[i] = result[count+i];
        return String.valueOf(A);
    }
    
    public static void main(String[] args){
        long t1 = System.currentTimeMillis();
        BigNumber test = new BigNumber();
        String A = "123456789123232342432423441345342523452534235443253254";
        String B = "987654322234242424332423414324532542354325235345435435";
        System.out.println("大整数A*B的结果:"+test.getMultiBigNumber(A, B));
        BigInteger bigInteger1 = new BigInteger("123456789123232342432423441345342523452534235443253254");
        BigInteger bigInteger2 = new BigInteger("987654322234242424332423414324532542354325235345435435");
        bigInteger2 = bigInteger2.multiply(bigInteger1);
        System.out.println("验证后A*B的结果:"+bigInteger2);
        long t2 = System.currentTimeMillis();
        System.out.println("耗时:"+(t2-t1)+" 毫秒");
    }
}

运行结果:

大整数A*B的结果:121932631386721831198089710747298668585104317165230580938992491445929653074852215402191571860797295610655490
验证后A*B的结果:121932631386721831198089710747298668585104317165230580938992491445929653074852215402191571860797295610655490
耗时:4 毫秒
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137009.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月2日 下午6:36
下一篇 2022年6月2日 下午6:36


相关推荐

  • FPGA实现千兆以太网发送

    FPGA实现千兆以太网发送科研要求 使用手上的 DE2 115 开发板实现千兆以太网的数据发送千兆以太网使用的时钟频率为 125MHz 一般的 GMII 接口由于收发数据所使用的数据线为 8 根即一个时钟周期的上升沿可以发送 8bit 数据 而 DE2 115 开发板所使用的接口为 RGMII 收发数据所使用的数据线为 4 根 所以需要在一个时钟周期的上升沿和下降沿都进行数据的传输 如下图 TX DATA 和 RX DATA 接下来就是具体的 verilog 代码的编写了 在这里参考了黑金开发板百兆网口的代码 以太网一帧的数据并不只包括数据 还有以太网协议用来检验

    2026年3月16日
    2
  • python xml转excel_一个python 脚本将XML文件转换到excel

    python xml转excel_一个python 脚本将XML文件转换到excel需要下载一个module:xlwt,如下是sourcecodeimportxml.dom.minidomimportxlwtimportsyscol=0row=0defhandle_xml_report(xml_report,excel):problems=xml_report.getElementsByTagName(“problem”)handle_problems(p…

    2022年8月22日
    9
  • S3DIS数据集学习笔记

    S3DIS数据集学习笔记S3DIS 是一个大型的 3d 室内数据集 关于它的介绍网上很多了 它主要是由 xyz rgb 法向量 9 个特征和一个标签组成的 长度为 10 的向量 由于这个数据集比较大 不利于训练 PointNet 训练之前会将它进行预处理 划分为 1mx1m 的区域 然后再放入网络进行训练 下面是关于它的代码分析 这个数据集运行的前提是 你已经按照 PointNet 的 readme 运行了 collect indor3d data 将 txt 文件转换为了 npy 文件 classS3DISDa Dataset

    2026年3月26日
    1
  • 史上最全量化交易资源整理

    史上最全量化交易资源整理有些国外的平台、社区、博客如果连接无法打开,那说明可能需要“科学”上网国内在线量化平台:BigQuant-你的人工智能量化平台-可以无门槛地使用机器学习、人工智能开发量化策略,基于python,提供策略自动生成器镭矿-基于量化回测平台果仁网-回测量化平台京东量化-算法交易和量化回测平台聚宽-量化回测平台

    2022年7月21日
    40
  • directx修复工具强力修复_dll修复工具增强版

    directx修复工具强力修复_dll修复工具增强版说明:   此更新包仅限于升级已有的程序至最新版(如从V1.0版、V1.1版、以及V1.2标准版升级到V1.2增强版),如果您之前没有使用过DirectX修复工具,请勿使用本更新包,请直接从官方地址下载完整的程序包。 下载地址:http://download.csdn.net/detail/vbcom/4050752 请按照压缩包内的“更新说明.txt”文件进行更新即可。

    2022年5月3日
    56
  • Windsurf编辑器:Cursor临时平替无限续杯指南

    Windsurf编辑器:Cursor临时平替无限续杯指南

    2026年3月16日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号