`
bannamoon
  • 浏览: 53447 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java实现任意整数相乘

    博客分类:
  • JAVA
 
阅读更多
public class Mutiply {

	public static void main(String[] args) {
		BigInteger multiplier = new BigInteger("-673589893565890368590578967285490682958485023495834902583490589345798583495723487563482756347856673589893565890368590578967285490682958485023495834902583490589345798583495723487563482756347856");
		BigInteger multiplicand = new BigInteger("-859085903425878805823409584039269057908349673285902345849035890878809586908504397562358476278584376328590385689457043257834927534095734956347853485");
		long st1 = System.currentTimeMillis();
		for(int index=0;index<1000;index++){
			multiply(multiplier, multiplicand);
		}
		System.out.println(System.currentTimeMillis()-st1);
		long st2 = System.currentTimeMillis();
		for(int index=0;index<1000;index++){
			multiplier.multiply(multiplicand);
		}
		System.out.println(System.currentTimeMillis()-st2);
	}
	
	public static String multiply(BigInteger multiplier, BigInteger multiplicand){
		boolean isResultNegative = false;
		if(multiplier.signum()==0 || multiplicand.signum()==0){
			return "0";
		}
		if(multiplier.signum()==-1 || multiplicand.signum()==-1){
			if(!(multiplier.signum()==-1 && multiplicand.signum()==-1)){
				isResultNegative = true;
			}
		}
		return (isResultNegative?"-" : "") + multiply(multiplier.toString().replace("-", ""), multiplicand.toString().replace("-", ""));
	}
	
	public static String multiply(String multiplier, String multiplicand){
		if(multiplier.length()>multiplicand.length()){
			String temp = multiplier;
			multiplier = multiplicand;
			multiplicand = temp;
		}
		int length = multiplicand.length()+multiplier.length();
		char[] result = new char[length];
		for(int indexOfResult=0;indexOfResult<result.length;indexOfResult++){
			result[indexOfResult] = '0';
		}
		
		String[] tempResults = new String[multiplier.length()];
		for(int indexOfMultiplier=0;indexOfMultiplier<multiplier.length();indexOfMultiplier++){
			char[] tempResult = new char[length];
			for(int indexOftempResult=0;indexOftempResult<tempResult.length;indexOftempResult++){
				tempResult[indexOftempResult] = '0';
			}
			int singleMultiplier = Integer.valueOf(String.valueOf(multiplier.charAt(multiplier.length()-1-indexOfMultiplier)));
			if(singleMultiplier!=0){
				int singleStep = 0;
				for(int indexOfmultiplicand=0;indexOfmultiplicand<multiplicand.length();indexOfmultiplicand++){
					int singleMultiplicand = Integer.valueOf(String.valueOf(multiplicand.charAt(multiplicand.length()-1-indexOfmultiplicand)));
					int singleResult = singleStep + singleMultiplier*singleMultiplicand;
					singleStep = singleResult/10;
					tempResult[tempResult.length-indexOfMultiplier-indexOfmultiplicand-1] = (""+singleResult%10).charAt(0);
				}
				tempResult[tempResult.length-indexOfMultiplier-multiplicand.length()-1] = ("" + singleStep).charAt(0);
			}
			
			tempResults[indexOfMultiplier] = String.valueOf(tempResult);
		}
		
		int step = 0;
		for(int indexOfResult=0; indexOfResult<length; indexOfResult++){
			int multiResult = step;
			for(int indexOfTempResults=0;indexOfTempResults<tempResults.length;indexOfTempResults++){
				multiResult += Integer.valueOf(String.valueOf(tempResults[indexOfTempResults].charAt(length-1-indexOfResult)));
			}
			step = multiResult/10;
			result[result.length-indexOfResult-1] = (""+multiResult%10).charAt(0);
		}
		return String.valueOf(result);
	}
}


结果对比:
578671582252594476786199322413773832540849019479781209035507587576779550181736165461400001640216752920490028498890769204733283108280630943510991915921171610703486725119777750465131309033130699124992461394973593046143133767470798477438073390294712136103115909945569596014299669909031490482950743553619069179063137722898136350387343581878160
578671582252594476786199322413773832540849019479781209035507587576779550181736165461400001640216752920490028498890769204733283108280630943510991915921171610703486725119777750465131309033130699124992461394973593046143133767470798477438073390294712136103115909945569596014299669909031490482950743553619069179063137722898136350387343581878160

虽然结果一致,但由于本人实现方式不算优,性能比JAVA默认的BigInteger实现整数相乘性能差很多,尤其是在计算遍数多的情况下。不是一个数量级的。
分享到:
评论

相关推荐

    JAVA实现大整数相乘

    然而,如果要手动实现大整数相乘的算法,一种经典的解决方案是Karatsuba算法,它是一种分治策略的高效乘法算法。对于两个n位的数字,传统的乘法算法需要O(n^2)的时间复杂度,而Karatsuba算法只需O(n^1.585),在处理...

    任意大的两个数相乘

    在编程领域,处理大数(任意大的整数)相乘是一项常见的挑战,特别是在算法竞赛、数学计算或金融计算中。这种操作通常涉及到超出标准整数类型(如int或long)范围的数字。以下是对“任意大的两个数相乘”这个知识点...

    任意正整数都能拆成若干唯一的2的幂指数之和

    任意正整数都能拆成若干唯一的2的幂指数之和,php版本和js版本都有。

    java实现杨辉三角显示

    阶乘是将一个正整数n与小于等于它的所有正整数相乘的结果,例如5! = 5 × 4 × 3 × 2 × 1 = 120。这个函数使用递归方式计算阶乘,当n等于1或0时返回1,否则返回n乘以n-1的阶乘。 2. `print(int n, int m)` 函数:...

    JAVA大数相乘

    "JAVA大数相乘"这个主题主要涉及到Java中的`BigInteger`类,它提供了对任意精度整数的支持,能够有效地处理大数运算,包括加法、减法、乘法、除法以及更复杂的数学操作。`BigInteger`类是Java标准库`java.math`包的...

    Java版超大整数阶乘算法代码详解-10,0000级

    在本文中,我们将介绍一种使用 Java 实现的超大整数阶乘算法代码详解,采用“数组进位”算法来解决超大整数的阶乘问题。 首先,让我们来了解一下什么是阶乘。阶乘是一个数学运算符,表示一个数的所有正整数因子相乘...

    java大数乘法的简单实现 浮点数乘法运算

    在Java中,我们可以使用字符串来存储这些大数,因为字符串可以容纳任意长度的数字序列。在提供的代码示例中,`BigNumber` 类实现了这个功能。 代码的核心在于 `bigNumberMultiply` 方法,它接收两个字符串参数,...

    浅谈Java double 相乘的结果偏差小问题

    `BigDecimal`是Java提供的一个用于进行任意精度的十进制运算的类,它可以避免浮点数运算的精度问题。以下是使用`BigDecimal`的示例代码: ```java import java.math.BigDecimal; import java.math.RoundingMode; ...

    Java计算阶乘 源代码

    本项目提供的"Java计算阶乘 源代码"旨在帮助我们实现任意整数的阶乘计算。首先,我们需要理解什么是阶乘。阶乘是将一个正整数n与小于它的所有正整数相乘的结果,表示为n!。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。...

    大数相乘指数幂的实现

    在实际编程中,很多编程语言提供了内置的大数库,如Python的`decimal`和`fractions`模块,Java的`BigInteger`类,C++的GMP库等,它们实现了上述算法并提供了方便的API供开发者使用。在编写代码时,理解这些算法的...

    code2_大整数乘法_

    这种算法将每个大整数分解成若干个单个的数字,然后逐位相乘并累加结果。但由于这种方法的时间复杂度较高,对于非常大的整数并不高效。 一种更高效的算法是Karatsuba算法,由苏联数学家Alexey Karatsuba在1960年...

    正大整数 (+-×)

    正大整数的引入就是为了解决这个问题,它可以表示任意大小的整数。 2. **正大整数的数据结构**: 大多数实现正大整数的方式是通过数组或链表存储一系列较小的整数(通常是字节或短整型),这些小整数组合起来表示...

    最小的能被1-20中每个数整除的正整数是多少

    对于任意两个正整数a和b,它们的最小公倍数LCM(a, b)是能够同时被a和b整除的最小正整数。 为了求解1至20的所有整数的最小公倍数,我们可以考虑以下步骤: 1. **分解质因数**:首先将1至20中的每个数字分解为质因数...

    Java练习题,实用于Java大部分人群

    ### Java练习题知识点详解 #### 1. 斐波那契数列 - **知识点**:斐波那契数列是一种常见的数学...以上练习题涵盖了Java编程语言的多个方面,包括基础语法、数据结构、算法实现等,适合不同程度的Java学习者进行练习。

    用链表编写的一个加减乘运算器,实现任意大数的加减乘运算

    总的来说,使用链表表示大数并实现加减乘运算,可以灵活地处理任意大小的整数,而无需受制于固定大小的数据类型。这种实现方式不仅有助于理解大数计算的原理,而且在实际编程中也有很高的实用性。通过不断优化算法,...

    mul.zip_Mul(ti)住宅_mul的范围_大数相乘

    当两个大整数相乘的结果超过这些类型的表示范围时,我们需要采用专门的大数运算库或者自定义算法来处理这种运算。 1. **大数运算库**:许多编程语言提供了支持大数运算的库,例如Python的`decimal`和`fractions`...

    Java实现 稀疏矩阵乘积

    提供的Java代码示例中,`Demo4矩阵相乘`类实现了这个算法。首先通过`Scanner`类读取输入的矩阵信息,然后创建两个三元组数组`a[]`和`b[]`来存储矩阵A和B的非零元素。接下来,遍历这两个数组,执行上述步骤计算矩阵...

    java算法大全源代码

    - 大整数乘法:如Karatsuba乘法和Toom-Cook乘法,将大整数分解后相乘,降低计算复杂度。 - 快速幂运算:高效求解a的n次方,通过反复平方和乘法实现。 7. 回溯法: - 搜索问题:如八皇后问题、数独问题,通过尝试...

    java经典算法40例

    - 将一个正整数分解成若干个质数相乘的形式,这些质数被称为该数的质因数。 - 分解质因数的过程通常从最小的质数开始尝试。 #### Java实现 - **递归分解**:使用递归函数逐步分解整数,每次找到最小的质数因子,...

    JAVA经典算法

    对于一个正整数n,将其分解成若干个质数相乘的形式。 #### 示例代码分析: 示例代码提供了一种分解质因数的方法: ```java public void fengjie(int n) { for (int i = 2; i ; i++) { if (n % i == 0) { System....

Global site tag (gtag.js) - Google Analytics