算法-大数相乘

解决算法;
*  1. 模拟小学乘法:最简单的乘法竖式手算的累加型;
*  2. 分治乘法:最简单的是Karatsuba乘法,一般化以后有Toom-Cook乘法;
*  3. 快速傅里叶变换FFT:(为了避免精度问题,可以改用快速数论变换FNTT),时间复杂度O(N lgN lglgN)。具体可参照Schönhage–Strassen algorithm;
*  4. 中国剩余定理:把每个数分解到一些互素的模上,然后每个同余方程对应乘起来就行;
*  5. Furer’s algorithm:在渐进意义上FNTT还快的算法。不过好像不太实用,本文就不作介绍了。大家可以参考维基百科Fürer’s algorithm

参考地址:https://blog.csdn.net/u010983881/article/details/77503519

1. 小学乘法代码如下:

/*** 模拟小学乘法*/public static String primaryMul(String str1, String str2){System.out.println("start primaryMul param=" + str1 + "," + str2 + ";time=" + System.currentTimeMillis());int[] int1 = string2IntArray(str1);int[] int2 = string2IntArray(str2);List<Integer> result = new ArrayList<>();for (int i = int1.length-1; i >=0 ; i--) {List<Integer> tempList = new ArrayList<>();int ten = 0;for (int j = int2.length-1; j >=0 ; j--) {int a = int1[i] * int2[j] + ten;ten = a / 10;tempList.add(a % 10);}if (ten > 0){tempList.add(ten);}//两行相加int carry = 0;for (int j = 0; j < tempList.size(); j++) {int r1 = 0;int index = j + (int1.length-1-i);if (index < 0 | result.size() > index){r1 = result.get(index);}int a = tempList.get(j) + r1 + carry;carry = a / 10;if (index < 0 | result.size() > index){result.set(index, a % 10);}else{result.add(a % 10);}}if (carry > 0){result.add(carry);}}//方向旋转int copy;for (int i = 0; i < result.size(); i++) {if (i < result.size() / 2){copy = result.get(i);int index = result.size() -1 -i;result.set(i, result.get(index));result.set(index, copy);}}StringBuilder sb = new StringBuilder();for (Integer integer : result) {sb.append(integer);}System.out.println("end primaryMul result=" + sb + ";time=" + System.currentTimeMillis());return sb.toString();}public static int[] string2IntArray(String str){String[] strs = str.split("");int[] ret = new int[strs.length];for (int i = 0; i < strs.length; i++) {ret[i] = Integer.parseInt(strs[i]);}return ret;}

2. 小学算法-累加算法

 

/*** 模拟小学乘法 - 累加算法*/private static String accumul(String str1, String str2){System.out.println("start accumul param=" + str1 + "," + str2 + ";time=" + System.currentTimeMillis());int[] int1 = string2IntArray(str1);int[] int2 = string2IntArray(str2);int[] result = new int[int1.length + int2.length];for (int i = 0; i < int1.length; i++) {for (int j = 0; j < int2.length; j++) {result[i + j + 1] += int1[i] * int2[j];}}for (int i = result.length - 1; i >= 0; i--) {if (result[i] >= 10){result[i-1] += result[i] / 10;result[i] = result[i] % 10;}}StringBuilder sb = new StringBuilder();for (Integer integer : result) {sb.append(integer);}System.out.println("end accumul result=" + sb + ";time=" + System.currentTimeMillis());return sb.toString();}

3. 分治算法-Karatsuba

/*** Karatsuba乘法*/
public static long karatsuba(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 halfN = Math.max(size1, size2) / 2;/* 拆分为a, b, c, d */long a = Long.valueOf(String.valueOf(num1).substring(0, size1 - halfN));long b = Long.valueOf(String.valueOf(num1).substring(size1 - halfN));long c = Long.valueOf(String.valueOf(num2).substring(0, size2 - halfN));long d = Long.valueOf(String.valueOf(num2).substring(size2 - halfN));// 计算z2, z0, z1, 此处的乘法使用递归long z2 = karatsuba(a, c);long z0 = karatsuba(b, d);long z1 = karatsuba((a + b), (c + d)) - z0 - z2;return (long)(z2 * Math.pow(10, (2*halfN)) + z1 * Math.pow(10, halfN) + z0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车雷达:实时SAR成像的实现

摘要: 众所周知,点云成像是目前实现汽车雷达感知最流行的方案,尤其是采用多级联实现的4D点云成像雷达,这是目前最有希望实现产品落地的技术方案之一。 今天重点分享关于汽车雷达SAR成像相关技术内容,这也证实了4D点云成像雷达并不一定就是汽车雷达成像唯一的方案,在业内…

CompletableFuture超详解与实践

0.背景 一个接口可能需要调用 N 个其他服务的接口&#xff0c;这在项目开发中还是挺常见的。举个例子&#xff1a;用户请求获取订单信息&#xff0c;可能需要调用用户信息、商品详情、物流信息、商品推荐等接口&#xff0c;最后再汇总数据统一返回。 如果是串行&#xff08;按…

React本地开发时,组件为啥会渲染两次

原因是因为使用了StrictMode &#xff0c; StrictMode 是一个用来突出显示应用程序中潜在问题的工具。与 Fragment 一样&#xff0c;StrictMode 不会渲染任何可见的 UI。它为其后代元素触发额外的检查和警告。 StrictMode 目前有助于&#xff1a; 识别不安全的生命周期 {#id…

前端如何结合数据库查看本地头像文件,配置静态资源

由于oss过期了&#xff0c;项目中又需要一个上传头像功能&#xff0c;于是研究了一下上传文件至本地&#xff0c;用java将文件存储到本地的代码好写&#xff0c;但是如何利用前端Vue把我难住了&#xff0c;因为之前存在OSS服务器直接查看就可以了&#xff0c;于是记录本文。 后…

数据结构-测试4

一、判断题 1.队列结构的顺序存储会产生假溢出现象。 &#xff08;T&#xff09; 2.度为二的树就是二叉树。(F) 二叉树的度可以小于等于2 3. 栈是插入和删除只能在一端进行的线性表&#xff1b;队列是插入在一端进行&#xff0c;删除在另一端进行的线性表。&#xff08;T&…

如何彻底卸载Microsoft Edge浏览器

一、引语 随着微软推出全新的Edge浏览器&#xff0c;许多用户可能想要尝试或完全切换到其他浏览器。在这篇文章中&#xff0c;我们将向您介绍如何彻底卸载Microsoft Edge浏览器&#xff0c;以确保您的系统干净整洁。 二、通过系统设置卸载 1、首先&#xff0c;右键单击桌面上…

C //练习 1-11 你准备如何测试单词计数程序?如果程序中存在某种错误,那么什么样的输入最可能发现这类错误呢?

C程序设计语言 &#xff08;第二版&#xff09; 练习1-11 练习 1-11 你准备如何测试单词计数程序&#xff1f;如果程序中存在某种错误&#xff0c;那么什么样的输入最可能发现这类错误呢&#xff1f; 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&am…

C++模板——(2)函数模板的声明和使用

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 勤奋&#xff0c;机会&#xff0c;&am…

Linux文件系统与日志管理

目录 一、Linux文件系统 1、inode 与 block 详解 1.1 inode 和 block 概述 1.2 inode表的内容 1.3 查看文件的inode号码 1.4 模拟innode号耗尽故障处理 2、访问文件的流程 3、文件恢复 3.1 恢复误删除的ext3格式文件 3.2 恢复误删除的 xfs 格式文件 二、Linux日志…

《BackTrader量化交易图解》第8章:plot 绘制金融图

文章目录 8. plot 绘制金融图8.1 金融分析曲线8.2 多曲线金融指标8.3 Observers 观测子模块8.4 plot 绘图函数的常用参数8.5 买卖点符号和色彩风格 8. plot 绘制金融图 8.1 金融分析曲线 BackTrader内置的plot绘图函数&#xff0c; 通过style参数变量控制不同风格的K线图&…

因为热Key和大Key,Redis终于被压崩了

大家好&#xff0c;我是洋子&#xff0c;今天分享一下在做压测时遇到的很有意思的性能问题以及对应的排查解决方案。这个性能问题的现象为&#xff0c;Redis线上实例不可用&#xff0c;Redis读写均超时 性能问题排查过程 先来看一下问题代码&#xff08;Go语言实现&#xff0…

Android 8.1 默认赋予应用权限

Android 8.1 默认赋予应用权限 最近接到项目需求&#xff0c;需要默认授予预置APP的应用权限以便操作使用&#xff0c;具体修改参照如下&#xff1a; /frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java private void grantDefau…

【CMake】1. VSCode 开发环境安装与运行

CMake 示例工程代码 https://github.com/LABELNET/cmake-simple 插件 使用 VSCode 开发C项目&#xff0c;安装 CMake 插件 CMakeCMake ToolsCMake Language Support &#xff08;建议&#xff0c;语法提示) 1. 配置 CMake Language Support , Windows 配置 donet 环境 这…

RT-Thread: 基于STM32CubeMX配置驱STM32驱动的USB虚拟串口调试

关键词&#xff1a;USB 虚拟串口 USB虚拟串口&#xff0c;RT-Thread Studio&#xff0c;STM32 说明&#xff1a; 1&#xff1a;文档记录 STM32F103系列基于 RT-Thread 系统的 USB虚拟串口的开启及数据收发应用流程介绍。 2&#xff1a;本文以STM32F103C8T6型号做测试&#x…

【mysql】Mac安装mysql

1.安装mysql brew install mysql提示&#xff1a;We’ve installed your MySQL database without a root password. 2.给root用户设置密码 ##To connect run mysql -u root ##设置密码 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY a12345678*;3.启动…

计算机基础面试题 |16.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

卡码网Java基础课 | 4. A+B问题IV,5. A+B问题VIII

卡码网Java基础课| 4. AB问题IV&#xff0c;5. AB问题VIII 三元运算符4. AB问题IV5. AB问题VIII 三元运算符 普通if int a 10; int b 20; int c; if (a > b) {c a; } else {c b; }而三元运算符的结构如下&#xff1a; 会先求expression的值&#xff0c;如果为 true ,则…

SLB、DMZ、Nginx、Ingress、Gateway、Kibana和Grafana

SLB、DMZ、Nginx、Ingress、Gateway、Kibana和Grafana虽然有一些相似之处&#xff0c;但是它们的功能和适用场景还是有所不同。 SLB主要用于将大流量的请求分配到多个服务器上进行处理&#xff0c;从而提高系统的可伸缩性和可靠性。它适用于需要处理大流量的应用&#xff0c;如…

ANSIC的编译限制有哪些?

ANSIC&#xff08;即C89&#xff0c;也称为ISO/IEC 9899:1989&#xff09;标准中对编译器的限制。 主要体现在以下几个方面 1、函数形参数量上限 ANSIC规定的函数形参数量上限为31个。 2、函数调用时实参数量上限 ANSIC规定的函数调用时实参数量上限也是31个。 3、一条源…

Win10电脑关闭OneDrive自动同步的方法

在Win10电脑操作过程中&#xff0c;用户想要关闭OneDrive的自动同步功能&#xff0c;但不知道具体要怎么操作&#xff1f;首先用户需要打开OneDrive&#xff0c;然后点击关闭默认情况下将文档保存到OneDrive选项保存&#xff0c;最后关闭在这台电脑上同步设置保存就好了。接下来…