大整数乘法(递归+分治法)
目录
一、问题描述
二、思路分析
分治法介绍:
问题分析:
三、算法伪代码
四、代码实现效果
五、源代码
六、参考文章
一、问题描述
请设计一个有效的算法,可以进行两个n位大整数的乘法。(n=2^k, k=1,2,3....)
二、思路分析
分治法介绍:
分治法: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。
有两点需要记住:
(1) 分治法基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。
(2)递归的解这些子问题,然后将各子问题的解合并得到原问题的解。
分治法的重点是分析问题是否可以划分为规模较小的子问题,难点是如何划分以及划分之后如何将各个子问题的解合并成最终的解。这一般需要用到数学知识或者其他理论。
问题分析:
我们可以把X分成a b两部分, Y分成c d两部分
那么就有如下操作
我们考虑到这里有4个乘法ac ad bc bd,我们是不是可以通过减少乘法的次数来降低时间复杂度呢?答案是可以的,进行如下操作:
这两个算法的时间复杂度
但是要注意a+b, d+c可能得到m+1位的结果,使问题规模扩大,所以我们选择这里面的第一种算法 。
三、算法伪代码
四、代码实现效果
五、源代码
# 理想状态下大整数乘法
# X = a b
# Y = c d
# XY = ac10^n + (ad+bc)10^(n/2) + bd O(n^2)
# XY = ac10^n(移位操作) + [(a-b)(d-c)+ ac + bd]10^(n/2) + bd O(n^1.59)def SING(N):return 1 if N > 0 else -1def BigNumerMultiply(X, Y, n):sign = SING(X) * SING(Y)X = abs(X)Y = abs(Y)# 递归退出条件if X == 0 or Y == 0:return 0elif n == 1:return sign * X * Yelse:halfN = int(n / 2) # 也可以使用字符串切割获取a = int(X / pow(10, halfN))b = int(X % pow(10, halfN))c = int(Y / pow(10, halfN))d = int(Y % pow(10, halfN))AC = BigNumerMultiply(a, c, halfN)BD = BigNumerMultiply(b, d, halfN)ABCD = BigNumerMultiply(a-b, d-c, halfN)result = AC*pow(10, n)+(ABCD+AC+BD)*pow(10, halfN)+BDreturn sign * resultif __name__ == '__main__':print('理想状态下用法!')X = int(input('请输入第一个n(n=2^k)位整数:'))Y = int(input('请输入第二个n(n=2^k)位整数:'))n = len(str(X))result = BigNumerMultiply(X, Y, n)print('分治乘法:{}'.format(result))print('普通乘法:{}'.format(str(X * Y)))# 样例输入:
# 1. 2.
# 4567 12345678
# 1234 12345678
#
#
# 错误输入:
# 1. 2.
# 123456 123
# 123456 123
六、参考文章
分治法的经典问题——大整数相乘 - m0w3n - 博客园
大整数乘法(递归+分治法)相关推荐
- PYTHON:大整数乘法(分治法)
何为分治法: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.即一种分目标完成程序算法,简单问题可用二分法 ...
- 大整数乘法(分治法)
大整数乘法(分治法) 题目描述:设X和Y都是n位的十进制整数,计算它们的乘积X*Y. 如果按照我们日常的计算方法,应该就是将两个数逐位相乘,最后加起来得到最终的结果,时间复杂度为O(n2); 因此我们 ...
- 【分治算法】大整数乘法
前言 最近开了算法导论课,上来就是递归分治,大整数乘法就是分治法的典型案例,通过参考网上书上我终于编程实现了大整数乘法,特此纪念 原理 由于两个大整数直接相乘太大,所以我们可以将它划分成几个小块分别相 ...
- 分治法实验之大整数乘法(算法设计分析)
分治法实验之大整数乘法 01. 问题描述 02. 输入格式 03. 输出格式 04. 输入样例 05. 输出样例 06. 问题分析 07. 算法设计 08. 代码实现 09. 测试结果 10. 复杂度 ...
- 分治法求解大整数乘法
算法导论课作业:分治法求解大整数乘法 – 学号:20204227058 求解思想 实现大整数乘法的方法有许多种,其中我们最简单的方法就是小学里面教的竖式算法,这种方法在计算过程中数AAA需要和数B ...
- c++/c 大整数乘法的分治与递归实现(string存储)
c++/c 大整数乘法的分治与递归实现(string存储) 最基础的分治和递归实现,算是思路比较清晰但是较暴力的算法, 不多说,看代码,速度不快,但重要在思想与细节. #include<iost ...
- 【分治】大整数乘法(C++)
刚发现个问题,,初学时竟然是使用的long型进行计算的,导致这篇文章虽展现了分治的想法,但并没有实际解决大整数乘法的计算问题. 仅供参考,日后再改 一.大整数乘法 一般计算方法 有n位大整数X和Y,计 ...
- 使用快速傅里叶变换计算大整数乘法-代码
在上一篇随笔"使用快速傅里叶变换计算大整数乘法"中,已经讲述了使用快速傅里叶变换计算大整数乘法的原理.在这一篇随笔中,我们就使用快速傅里叶变换来实现一个提供任意精度的算术运算的静态 ...
- C语言(CED)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。
)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出. [输入] 第一行包含一个整数n,表示数组的大小. 第二行包含n个整数,表示数组的元素,整数之间以一个 ...
最新文章
- beast linux加密,PHP-Beast v2.2发布,PHP源码加密扩展
- linux系统编程:线程原语
- RGB转YUV 各种库的性能比较
- SQL Server 查看表定义的 2 种方法
- 把接口作为函数的参数,那么任何实现了接口的类的实例都可以作为此函数的参数传递...
- HTML+CSS实现菜单的3D翻转特效
- oracle 数据库 swap,Oracle swap 100%案例分析
- 计算所与北大往事回顾
- python字符串行列转换_Excel、SQL、Python分别实现行列转换
- 2021-5-25有限元从0开始第六天(Lp空间,弱导数)
- Calibre中使用DeDRM插件进行Kindle电子书解锁
- springBoot发送邮件附件名称乱码的解决
- 3. KNN最近邻算法详解与关键技术剖析(理论篇)
- 使用mysql_upgrade升级mysql5.1至5.6的数据库升级实施方案
- 五笔字典编码--------------_
- 漫画 | 程序员才是真正的“甩锅”大师!
- HINSTANCE,HWND、HMODULE 详解
- 0510课堂笔记--数组-面向对象
- jsp ztree mysql 例子_ztree前台实例
- 最实用的Python基础讲解,带你轻松学完数据类型
热门文章
- 会员计费系统c语言_高速公路计费系统 (代码)
- JAVA + GeoLite2+ip定位,查询国家地理位置信息
- 【JVM进阶之路】五:垃圾回收概述和对象回收判定
- Greenplum概念学习——节点分布模式:grouped、spread
- 使用叉叉助手写手机脚本 下载编译器+环境准备
- select 1,select *,select count(),select sum(),select null
- 文件拆分与合并(VE)
- [转载] 知无涯之C++ typename的起源与用法
- 2018新型手机号正则表达式
- 魔镜VR导出Android工程