热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java实现大数乘法(分治算法)

本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。
 
 
java代码(long需要改变)
import java.util.Arrays;
import java.util.Scanner;
public class 大数乘法 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("输入数据:");
        String a = in.nextLine();
        String b = in.nextLine();
        long num1 = temp(a);
        long num2 = temp(b);
        String result1 =  bigNumberMulti(a, b);
        long result2 = karatsubaMulti(num1, num2);
        System.out.println("普通大数乘法的结果:\n"+a+" * "+b+"\n= "+result1);
        System.out.println("Karatsuba大数乘法结果:\n"+a+" * "+b+"\n= "+result2);

    }



    public static String bigNumberMulti(String a, String b){
        //字符串转换成数组
        char[] charArr1 = a.trim().toCharArray();
        char[] charArr2 = b.trim().toCharArray();
        int[] arr1 = new int[charArr1.length];
        int[] arr2 = new int[charArr2.length];
        for (int i = 0; i ) {
            arr1[i] = charArr1[i] - ‘0‘;
        }
        for (int i = 0; i ) {
            arr2[i] = charArr2[i] - ‘0‘;
        }

        //大数乘法(不进位)
        int[] result = new int[arr1.length + arr2.length];
        for (int i = 0; i ) {
            for (int j = 0; j ) {
                result[i+j+1] += arr1[i] * arr2[j];
            }
        }
        //处理进位,result是逆序储存的
        for (int k = result.length - 1; k > 0; k--) {
            if(result[k] >= 10 && k != 1){
                result[k-1] += result[k]/10;
                result[k] %= 10;
            }
        }
        String resultStr = "";
        for (int i = 1; i ) {
            resultStr += ""+result[i];
        }
        return resultStr;
    }
    public static long karatsubaMulti(long num1, long num2 ){
        if(num1 <10 || num2 <10)
            return num1*num2;
        int size1 = String.valueOf(num1).length();
        int size2 = String.valueOf(num2).length();
        int halfSize = Math.max(size1, size2) / 2;

        long a = Long.valueOf(String.valueOf(num1).substring(0, size1 - halfSize));
        long b = Long.valueOf(String.valueOf(num1).substring(size1 - halfSize));
        long c = Long.valueOf(String.valueOf(num2).substring(0, size2 - halfSize));
        long d = Long.valueOf(String.valueOf(num2).substring(size2 - halfSize));

        long x0 = karatsubaMulti(b, d);
        long x2 = karatsubaMulti(a, c);
        long x1 = karatsubaMulti((a+b), (c+d)) - x0 - x2;

        return (long)(x2*Math.pow(10, (2*halfSize)) + x1*Math.pow(10, halfSize) + x0);

    }
    public static long temp(String a){
        long result = 0;
        for (int i = 0; i ) {
            result *= 10;
            result += a.charAt(i) - ‘0‘;
        }
        return result;
    }

}

大数乘法(分治)


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
author-avatar
傅笑寒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有