采用分治法进行大数乘法运算 (java)

算法设计与分析:第三章 分治 3.3二进制大整数的乘法 /* 二进制大整数的乘法: 请设计一个有效的算法,可以进行两个n 位二进制大整数的乘法运算 设x = 3141, A = 31 B=41 y = 5327, C = 53,D=27 x*y = AC*2^n + (AD + BC)*2^(n/2) + BD = AC*2^n + ((A-B)*(D-C) + A*C + B*D)*2^n + BD //少算一次乘法 递归基: 阅读详情

*************************************************************
  此程序 采用分治法进行乘法运算
*  求 1011*1101
*  coder: 九天神龙
*  运行结果:
* H:/Java/算法/大整数~1>javac mult.java
*
* H:/Java/算法/大整数~1>java mult
* 11x13 结果为: 143
*
* H:/Java/算法/大整数~1>
**************************************************************/
import java.lang.*;
class mult{

public int x,y; //本题要求积的两个数

//初始化本题中要求的两个数
mult(){
  x=11; //二进制的 1011
  y=13; //二进制的 1101
}


//**************************************************
// 函数名 getvalue,此函数为本算法的主函数
// 反回值为指定数xy的积
// 根据公式 XY=A*C*2n+((A-B)(D-C)+AC+BD)*2n/2+BD
// 共有3次乘法,6次加法,2次移位
//**************************************************

public int getvalue(int a,int b,int c,int d){
  int n=4; //所求数的位数
   
  return (a*c*(2<<(n-1))+
    ((a-b)*(d-c)+a*c+b*d)*
    (2<<(n/2-1))+
    b*d);
}

public static void main(String[] args){
  int n=2;
  mult mu=new mult();
  int a,b,c,d;
  //将原乘数分解
  a=mu.x>>n;
  b=mu.x&3;
  c=mu.y>>n;
  d=mu.y&3;
 
  int ret=mu.getvalue(a,b,c,d);
   
  //output result
  System.out.println(""+mu.x+"x"+mu.y+" 结果为: "+ret);
}
}

算法学习-分治法-大整数乘法 基本问题  大整数乘法(C)设计一个有效的算法,可以进行两个n位大整数的乘法运算。设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。如果将每2个1位数的乘法或加法看作一步运算,那么这种方法要作O(n^2)运算才能乘积XY。    打问号处个人感觉有问题,不过乘法肯定 阅读详情

相关推荐

分治法实现两个二进制数的大整数乘法(带界面)

大整数分解问题:给定两个n位长二进制数x和y,这两个数的乘积。时间复杂性控制在Θ(n1.6)

[JAVA]大整数乘法分治法

大整数乘法是一种用于计算两个非常大的整数相乘的方法,通常超出了计算机硬件所能直接处理的范围。在这种情况下,我们需要使用一些特殊的算法来处理这类问题。本文将详细介绍大整数乘法的分治算法

weixin_66485800的博客 1191

用递归分治算法解决大整数乘积问题 java实现

算法分析与设计 用递归分治算法解决大整数乘积问题(用java语言)

分治法实现大数相乘二进制java

算法原理 大数相乘也采用分治法的思想,即将一个大数分成若干小数去计算。 通过计算多组2位数整数乘法,可以得出来一个规律AB * CD = AC (AD+BC) BD。如果BD相乘超过一位数,需要进位;(AD+BC+低位进位)如果超过一位数,需要进位。 假设M位二进制数和N位二进制相乘, 如果两个数M和N的长度都小于等于1位数,则直接返回X*Y的结果的字符串形式。 如果M、N长度不一致,补齐M高位0(不妨设N>M),使都为N位整数。 N/2取整,得到整数的分割位数。将M、N拆分成m1、m2,n1,n2.

qq_45843385的博客 1162

大整数乘法分治法 java,大整数的乘法分治法

function MULT(X,Y,n); {X和Y为2个小于2n的整数,返回结果为X和Y的乘积XY}beginS:=SIGN(X)*SIGN(Y); {S为X和Y的符号乘积}X:=ABS(X);Y:=ABS(Y); {X和Y分别取绝对值}if n=1 thenif (X=1)and(Y=1) then return(S)else return(0)else beginA:=X的左边n/2位;B:...

weixin_34013327的博客 884

(zz)采用分治法进行大数乘法运算java

/**************************************************************  此程序 采用分治法进行乘法运算 1011*1101*  coder: 九天神龙*  运行结果:* H:/Java/算法/大整数~1>javac mult.java** H:/Java/算法/大整数~1>java mult* 11x13 结果为: 143** H:

1637

java分治法最大最小值_(zz)采用分治法进行大数乘法运算java) | 学步园...

/************************************************************** 此程序 采用分治法进行乘法运算* 1011*1101* coder: 九天神龙* 运行结果:* H:/Java/public int x,y; //本题要积的两个数//初始化本题中要的两个数mult(){x=11; //二进制的 1011y=13; //二...

weixin_28859781的博客 149

采用分治法进行大数乘法运算

/************************************************************** 此程序 采用分治法进行乘法运算* 1011*1101* coder: 九天神龙* 运行结果:* H:/Java/算法/大整数~1>javac mult.java** H:/Java/算法/大整数~1>java mult*

倚天龍記 2946

java大整数乘法分治法,大数相乘(分治法, C/C++)

1、分治法有两点需要理解:(1)分治法基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。(2)递归的解这些子问题,然后将各子问题的解合并得到原问题的解。分治法的重点是分析问题是否可以划分为规模较小的子问题,难点是如何划分以及划分之后如何将各个子问题的解合并成最终的解。这一般需要用到数学知识或者其他理论。以大数相乘为例,有A,B两个大数,都为n位,要计算A*...

weixin_34882814的博客 654

大整数乘法分治法

大整数乘法分治法)实验报告,包括问题描述、问题分析、复杂度分析、源代码以及运行结果截图,100%可以运行。

二进制数相乘-分治法-C语言实现

二进制数相乘 分治法 C语言实现 优化了二进制乘法 是的时间复杂度降低了

分治法解决大整数乘法问题

通常,在分析算法的计算复杂性时,都将加法和乘法运算当作基本运算来处理,即将执行一次加法或乘法运算所需的计算时间,当作一个仅取决于计算机硬件处理速度的常数。这个假定仅在参加运算的整数能在计算机硬件对整数的表示范围内直接处理才是合理的。然而,在某些情况下,要处理很大的整数,它无法在计算机硬件能直接表示的整数范围内进行处理。若用浮点数来表示它,则只能近似的表示它的大小,计算结果中的有效数字也受到限制。若

Rachel Zhang的专栏 1万+

手撸代码系列(十)之分治法经典练习案例

第八期:实现大数乘法Java) 题目分析:以123456789*987654321为例 第一步: 当两个数都小于等于4位的时候,我们可以直接利用整数乘法进行相乘。(9999*9999=9998,0001,在int类型数据范围之中,而且很保守) 第二步:如果数 a 大于4位,我们对 a 进行平均切分成两段。a1=1234{a_1} = 1234a1​=1234(高位)和 a2=56789{a_2}...

诗酒趁年华 1821

java大数运算详解【其五】大数乘法之平方算法之ToomCook3平方算法

1.3、ToomCook3平方算法(三分展开式算法) /** * 使用3路Toom-Cook平方算法平方一个大整数。 * 当两个数字都大于某一阈值时(实验发现),应该使用它。 * 它是一种递归分治算法,其渐近性优于squareToLen和squareKaratsuba算法。 */ private BigInteger squareToomCook3() { int len = mag.length; // k是...

qq_25675517的博客 1155

java大数乘法分治_分治法的经典问题——大整数相乘

分治法的经典问题——大整数相乘分治法的原理分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。(来自度娘的搬运工)简单的说,分治就是分而治之,把一个问题拆分成几个小问题,最后再汇总解决的办法。有两点需要记住:(1) 分治法基本思想是将一个规模为n的问题分解为k...

weixin_31088605的博客 1747

经典算法分治法 大数相乘

题目描述: 用串的形式表示大数乘法。 即类似: "23234845847839461464158174814792" * "6457847285617487843234535" 要结果返回一个串。 解题思路: 采用分治法解题.具体方式已在代码中注释. 代码实现: import java.util.Scanner; public class Main {

striner的博客 2995

分治法实现大数乘法,加法,减法(java实现)

  大数乘法即多项式乘法问题,A(x)与B(x)乘积C(x),朴素解法的复杂度O(n^2),基本思想是把多项式A(x)与B(x)写成 A(x)=a*x^m+b B(x)=c*x^m+d 其中a,b,c,d为x的多项式。 则A(x)*B(x)=(ac)*x^2m+(ad+bc)*x^m+bd 由ad+bc=(a+b)(c+d)-ac-bd 原来的4次乘法和1次加法由3...

aabbaaoo1314的博客 323
上一篇: dom对xml文件增删查改操作
下一篇: javascript操作cookies and 正确使用cookies的属性
xxxatt
博客等级 码龄21年 20粉丝 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值