Karatsuba乘法--实现大数相乘
Karatsuba乘法
Karatsuba乘法是一种快速乘法。此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表。此算法主要用于两个大数相乘。普通乘法的复杂度是n2,而Karatsuba算法的复杂度仅为3nlog3≈3n1.585(log3是以2为底的)。
算法介绍
步骤简介
Karatsuba算法主要应用于两个大数的相乘,原理是将大数分成两段后变成较小的数位,然后做3次乘法,并附带少量的加法操作和移位操作。现有两个大数,x,y。首先将x,y分别拆开成为两部分,可得x1,x0,y1,y0。他们的关系如下:x = x1 * 10m + x0;y = y1 * 10m + y0。其中m为正整数,m < n,且x0,y0 小于 10m。那么 xy = (x1 * 10m + x0)(y1 * 10m + y0)=z2 * 102m + z1 * 10m + z0,其中:z2 = x1 * y1;z1 = x1 * y0 + x0 * y1;z0 = x0 * y0。此步骤共需4次乘法,但是由Karatsuba改进以后仅需要3次乘法。因为:z1 = x1 * y0+ x0 * y1z1 = (x1 + x0) * (y1 + y0) - x1 * y1 - x0 * y0,故z1 便可以由一次乘法及加减法得到。
实例展示
设x = 12345,y=6789,令m=3。那么有:12345 = 12 * 1000 + 345;6789 = 6 * 1000 + 789。下面计算:z2 = 12 * 6 = 72;z0 = 345 * 789 = 272205;z1 = (12 + 345) * (6 + 789) - z2 - z0 = 11538。然后我们按照移位公式(xy = z2 * 10^(2m) + z1 * 10^(m) + z0)可得:xy = 72 * 10002 + 11538 * 1000 + 272205 = 83810205。
#-*- coding:utf-8 -*- import math n=long(input()) m=long(input())l=0 t=0 if len(str(n))<len(str(m)):l = len(str(m))/2t = len(str(m)) - l else:l = len(str(n))/2t = len(str(n)) - l a=long(n/(math.pow(10,t))) b=long(n%(math.pow(10,t))) c=long(m/(math.pow(10,t))) d=long(m%(math.pow(10,t)))print a,b,c,dresult_1=long(a*c) result_2=long(b*d) result_3=long(a+b)*long(c+d)-long(result_1)-long(result_2) print result_1,result_2,result_3 result=long(result_1*math.pow(10,2*t))+long(result_3*math.pow(10,t))+long(result_2) print result print m*n
转载于:https://www.cnblogs.com/ybf-yyj/p/8656460.html
Karatsuba乘法--实现大数相乘相关推荐
- C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...
- karatsuba乘法
karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.[1]此算法主要用于两个大 ...
- 大数相乘(C语言,分治算法)
问题: 由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算.大数运算主要有加.减.乘三种方法. 下面就 ...
- 大数相乘、大数相加、大数相减Java版本
为什么80%的码农都做不了架构师?>>> 题目:两个非常大的数字相乘(相加,相减) 该题目在java中可以使用BigInteger类中的方法来实现.否则的话可以使用如下方式来实 ...
- 大数相乘(c语言/c++)
大数相乘(c语言/c++) 方法一:做加法 方法二.做乘法 方法一:做加法 思路:模拟竖乘过程.将num2从后往前一个一个的去乘num1.然后累加.在累加的时候记得在末尾补0.补的0的个数就是第二个字 ...
- 算法题-大数相乘问题
今天在网上看到一个大数相乘的问题,题目是这样的:输入两个整数,要求输出这两个数的乘积.输入的数字可能超过计算机内整形数据的存储范围. 分析: 由于数字无法用一个整形变量存储,很自然的想到用字符串来表示 ...
- 大数相乘(数组表示)
大数相乘 首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到 ...
- 历届试题 矩阵翻硬币 蓝桥杯 大数开方 大数相乘
历届试题 矩阵翻硬币 时间限制:1.0s 内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬 ...
- 超大数相乘的java代码,java版大数相乘
在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 用java搞了一个版本 这里说一下思路 将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次 ...
最新文章
- 为了孩子上名校,他们发论文给子女署名,Nature发文报道韩国学术不当行为
- vue 多页面iframe不刷新_Vue中iframe保持活动状态(不刷新)
- Boost库学习(0)
- 东北全面放开生育,数据揭秘人口和GDP和房价间联系
- 更新项目经常使用的Linux命令
- Linux学习之第二课时--linux命令格式及命令概述
- Heroku和Java –从新手到初学者,第2部分
- php 变量 可用拼音表示,php汉字转拼音的示例
- Oracle 数据怎么实时同步到 SQL Server | 亲测干货分享建议收藏
- 计算坐标点的距离计算机公式,计算两个GPS坐标点的距离
- 资源放送丨《基于IB网络的Oracle Extend RAC最佳实践》PPT视频
- CSS绝对定位absolute元素的初始包含块不是body元素,也不是html元素
- [流媒体]Android 播放HLS/RTSP的原生类库 MediaPlayer
- neo4j︱Cypher完整案例csv导入、关系联通、高级查询(三)
- FLV格式视频转换成MP4格式教程
- sql连表查询、子查询、组合查询
- 高仿今日头条视频列表功能
- ctfshow 爆破(web入门)
- c++实现经典游戏贪吃蛇(超详解)
- tableau通过集动作改变突出显示