大整数的乘法(分治法)
通常执行一次加法或乘法运算所需的计算时间看作一个仅取决于计算机硬件处理速度的常数。这个仅在参加运算的整数能在计算机硬件对整数的表示范围内直接处理才是合理的。若要精确地表示大整数并在计算结果中要求精确得到所有位数上的数字,就必须用软件的方法来实现大整数的算术运算。
问题描述:假设有两个大整数X、Y,分别设X=1234、Y=6789。现在要求X*Y的乘积,小学的算法就是把X与Y中的每一项去乘,但是这样的乘法所需的时间复杂度为O(N^2),(因为每一位要逐个去乘),所以效率比较低下。那我们可以采用分治的算法,将X、Y拆分成四部分,如下图:
则X可表示为:
同理Y也可以表示出来。
所以现在将一个大的整数分成了两部分,问题规模减小,这样直接相乘就会写成
但是这样你会发现,最后还是要计算4次n/2位整数的乘法,以及三次加法,根据master定理最后会发现T(n)=O(n^2);所以说这其实没有改进成功,要改进成功,就需要通过将算式变形来减少乘法的次数,对此,我们写成如下形式:
这样就能减少乘法的次数,(只做了AC,BD (A-B)(D-C)三次乘法),由master定理可得T(n)=O(n^log3),优化成功。
#include<iostream>
#include<cmath>using namespace std;int divideConquer(int X, int Y, int n){int x = abs(X);int y = abs(Y);if( x == 0 || y == 0){return 0;}else if( n == 1){return x * y;}else{int A = x / pow(10, n / 2);int B = x - A * pow(10, n / 2);int C = y / pow(10, n / 2);int D = y - C * pow(10, n / 2);int AC = divideConquer(A, C, n / 2);int BD = divideConquer(B, D, n / 2);int ABCD = divideConquer((A - B), (D - C), n / 2) + AC + BD;return AC*pow(10, n) + ABCD * pow(10, n / 2) + BD;}
}int main(){cout << divideConquer(1234, 9876, 4) << endl;return 0;
}
此代码主要想表达的是分治思想,在位数过大(经测试超过5位)会有误差,不能显示出正确的答案。
ps:可以考虑字符串转换的方法。
此文章参考:https://blog.csdn.net/wdxyxshark/article/details/108762552
(↑博主很优秀)
大整数的乘法(分治法)相关推荐
- 求一个整数的权重 c语言,Code Kata:大整数四则运算—乘法 javascript实现
上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...
- C语言(CED)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。
)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出. [输入] 第一行包含一个整数n,表示数组的大小. 第二行包含n个整数,表示数组的元素,整数之间以一个 ...
- Algorithm:C++语言实现之分治法相关问题(给定实数x和整数n,分治法求xn)
Algorithm:C++语言实现之分治法相关问题(给定实数x和整数n,分治法求xn) 目录 分治法 1.给定实数x和整数n,分治法求xn 分治法 1.给定实数x和整数n,分治法求xn
- 大数据处理基本思想——分治法
分治法--"分而治之" 众所周知,计算机计算速度非常快而被人们加以使用,但计算速度再快的计算机,处理数据的能力也有一定限度,所以在处理大数据操作的时候,采用分治法可以有效的处理目前 ...
- 大整数的乘法(递归方程+复杂度分析)
递归方程+复杂度分析 大整数的乘法 背景介绍 设X和Y都是n位二进制整数,现在需要计算它们的乘积XY,如果使用小学的思路设计算法,那么需要n2次乘法和n-1次加法,效率太低,那么能够设计出一种算法能够 ...
- 大整数的乘法、加法、减法
乘法用经典的算法来解决,还有分治法来解决大整数乘法,但是效率提升不明显而且代码稍烦.所谓的经典算法就是直接按照位相乘,然后换算进位的算法,也很简单.加法和乘法用到的进位算法一样,减法是用借位.注意结果 ...
- 矩阵乘法分治法c语言,分治法举例之矩阵乘法
分治法举例之矩阵乘法 前言 矩阵按定义直接实现是比较直接简单的.时间复杂度也可以直接得出来是(O(n^3)) 直接实现 class matrix: ''' 为了简单起见,没有对数据做校验. 假设矩阵就 ...
- 剑指offer第12题打印从1到n位数以及大整数加法乘法
字符和数字加减就是字符的ASCII码和数字直接加减. 方法一: 1)在字符串操作中给一个整形数字加(字符0)就是把它转化为字符,当然给一个字符减去(字符0)就可以把它转化为数字了:如果确实是最后一位字 ...
- 分治法大整数乘法c语言,大整数乘法(分治法)
#include #include using namespace std; int num(int u) //计算乘数的位数 { int i,num; i=1; num=u/10; while(nu ...
最新文章
- 关于0bug中一处读者质疑的回复
- malloc和free的深层次分析
- Matrix Equation
- Python学习13 异常处理机制
- 后台使用orm多还是直接sql_Django应用app创建及ORM
- BP算法和RNN_模型CNN-RNN-LSTM和GRU简介
- 基于Jekyll的博客模板
- 身处外包中!有过低谷 5年时间让我年薪近100W...我的不放弃,让我看见了最美的明天...
- [简单]1.宝石和石头
- phalcon开发工具(phalcon-devtools)
- 计算机打印指定测试页到文件夹中,上海计算机等级一级考试复习指导.pptx
- 如果报华为网络工程师中级培训班一般学费多少?
- 谷歌放弃了IE6/The Google phasing out support for IE6.0
- 基于卷积神经网络的像素级图像融合——硕士论文阅读笔记
- 第25节 虚拟专有网络原理及配置命令
- TheOpenGroupDPBoK个人认证计划
- word中自动生成参考文献引用及自动更新文献编号
- 手机几款超级好用的APP你都认识吗
- Ubuntu16.04下彻底卸载clion,安全可复原方法
- 企鹅龙drbl+再生龙clonezilla 自动化实践剖析
热门文章
- matlab 中netff,newff函数里的参数设置方法
- 多任务学习(Multi-task)keras实现
- 华为畅享9 Plus前沿硬件技术齐上阵 千元机游戏“旗舰”机体验
- EfficientNet B0-B7 网络参数
- 地图坐标系相互转换(WGS-84、GCJ-02、BD-09)
- TLS/SSL协议 RC4算法安全漏洞CVE-2013-2566
- MSP432编译环境搭建--KEIL版
- Towards Perceptual Image Dehazing by Physics-Based Disentanglement and Adversarial Training(2019)
- MongoDB 实验——数据备份和恢复和数据库优化
- 在HTML文件中属于字形,【多选题】网易考拉平台根据其盈利模式可以将其划分到(
)...