`
zhoujianghai
  • 浏览: 439894 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java实现大数相乘

阅读更多

计算大数:1234567891011121314151617181920 X 2019181716151413121110987654321?

 

 

计算结果:2492816912877266687794240983772975935013386905490061131076320; length=61

验证结果:2.4928169128772666E60

 

源代码如下:

/**
 * 计算大数相乘
 * @author zhoujianghai
 * zhoujiangbohai@163.com
 */
public class BigNumberCount {

	 public static void main(String agrs[]){
	 String number1 = "1234567891011121314151617181920";
	 String number2 = "2019181716151413121110987654321";
	  String result = multipBigNumber(number1,number2);
	  System.out.println("计算结果:"+result+"; length="+result.length());
	  System.out.println("验证结果:"+Double.parseDouble(number1) * Double.parseDouble(number2));
	 }
	
	 public static String multipBigNumber(String s1,String s2){
		  int longArray[] = null;
		  int shortArray[] = null;
		  int s1Length = s1.length();
		  int s2Length = s2.length();
		  int longLength = s1Length > s2Length ? s1Length : s2Length;
		  int shortLength = s1Length == longLength ? s2Length : s1Length;
		  longArray = new int[longLength];
		  shortArray = new int[shortLength];
		  String longString = s1Length >= s2Length ? s1 : s2; 
		  String shortString = s1.equals(longString) ? s2 : s1;
		  System.out.println("longString="+longString+"; shortString="+shortString); 
		  //低位在前,高位在后
		  for(int i = longLength - 1; i >= 0; i --){
			  longArray[longLength - 1 - i] = longString.charAt(i) - 48; 
		  }
		  for(int i = shortLength - 1; i >= 0; i --){
			  shortArray[shortLength - 1 - i] = shortString.charAt(i) - 48;
		  }
		 
		  StringBuffer results[] = new StringBuffer[longLength];
		  for(int i = 0; i < results.length; i++) {
			  results[i] = new StringBuffer();
	    	}
		  StringBuffer resultBuffer = new StringBuffer();
	   
		  /**
		   * 把被乘数的每一位与乘数逐位相乘
		   * 如:5607 * 2256,被乘数5607,乘数2256
		   * 7 * 6 + 0 = 42 :0表示低位向高位的进位
			 7 * 5 + 4 = 39
             7 * 2 + 3 = 17
             7 * 2 + 1 = 15
             29751
             0 * 6 + 0 = 0
             0 * 5 + 0 = 0
             0 * 2 + 0 = 0
			 0 * 2 + 0 = 0
			 00000
			 6 * 6 + 0 = 36
			 6 * 5 + 3 = 33
			 6 * 2 + 3 = 15
			 6 * 2 + 1 = 13
			 63531
			 5 * 6 + 0 = 30
			 5 * 5 + 3 = 28
			 5 * 2 + 2 = 12
			 5 * 2 + 1 = 11
			 08211
		   *  results:29751, 00000,63531,08211
		   * */
		  for(int i = 0; i < longLength; i ++){
		   int temp = 0;
		   int tempCarry = 0;//低位向高位的进位
		   int currentValue = 0; //当前位乘积的值
			   for(int j = 0; j < shortLength; j ++){
				  
				    temp = longArray[i] * shortArray[j] + tempCarry;
				    //System.out.println("longArray[i]="+longArray[i]+" * "+"shortArray[j]="+shortArray[j]+" + "+tempCarry+" = "+temp); 
				    tempCarry = temp / 10;
				    currentValue = temp % 10;
				    results[i].append(currentValue);
				    if(j == shortLength - 1){
				     results[i].append(tempCarry);//最高位有进位则进位,无进位则补0
				    }
			   }
			  System.out.println( results[i].toString()); 
		  }
		 /**低位补0,results[i]低位补i个0(低位在前,高位在后)
		  * 29751
			000000
			0063531
			00008211
		  *  */
		  for(int i = 0,length = results.length;i < length; i++){
		   String temp = "";
		   for(int j = 0; j < i; j ++){
		    temp += "0";
		   }
		   results[i].insert(0, temp);
		   System.out.println( results[i].toString()); 
		  }

		   /**把每一行相加(低位在前,高位在后,从左往右 加)
		  * 29751
			000000
			0063531
			00008211
		  -------------
		    29394621 
		    * 
		    * */
		  int tempCarry = 0;
		  int currentValue = 0; 
		  StringBuffer lastBuffer = results[results.length - 1];
		 //需要循环的次数  
        int times =  lastBuffer.length();  
       
        for(int i = 0; i < times; i ++ ){  
            int temp = 0;  
            for(int j = 0,length2 = results.length; j < length2; j ++){  
                if(results[j].length() > i){  
                    temp += (results[j].charAt(i) - 48);//把第j行的第i位的字符转换成int  
                }  
            }  
            temp += tempCarry;  
            tempCarry = temp / 10;  
            currentValue = temp % 10;  
            resultBuffer.append(currentValue);  
        }  

        StringBuffer finalResult = new StringBuffer();  

        boolean hasNumNotZero = false;
        //因为低位在前,高位在后,所以把29394621 转换成最终结果:12649392  
        for(int i = resultBuffer.length() - 1; i >= 0; i --) {  
            int temp  = resultBuffer.charAt(i) - 48;  
            if(temp != 0) hasNumNotZero = true;
            if (hasNumNotZero) finalResult.append(temp);    
        }  
        if (finalResult.length() == 0) finalResult.append(0);
        return finalResult.toString();  

    }  
}

 

 

 

 

转帖请注明出处:

 http://zhoujianghai.iteye.com/blog/1168264

 

分享到:
评论
2 楼 zhoujianghai 2012-06-25  
faulware 写道
本以为这么长的代码 肯定考虑了结果位数的问题,结果.... StringBuffer results[] = new StringBuffer[longLength];   那么13*9结果是2位数吗???

多谢指出错误,是循环的次数times弄错了,不需要减1,已纠正。不过StringBuffer results[] = new StringBuffer[longLength]这行代码是没有错误的,这个results里存储的不是结果的位数,是两数逐位相乘的结果,看看代码里的注释。results:29751, 00000,63531,08211 。

1 楼 faulware 2012-06-25  
本以为这么长的代码 肯定考虑了结果位数的问题,结果.... StringBuffer results[] = new StringBuffer[longLength];   那么13*9结果是2位数吗???

相关推荐

    java大数相乘代码

    java实现大数相乘,在不使用BigInteger工具方法的前提下进行大数相乘运算。

    java大数相乘(源代码)

    本程序可以求出:任意位的两个大数相乘的结果。 已经实验过&gt;2000位的两数相乘,有兴趣的话,你也试一试吧。 support me!thanks!

    大数相乘解决无限位数相乘问题

    本文将深入探讨大数相乘的基本概念、算法以及其实现方法。 首先,我们要理解什么是大数。在大多数编程语言中,整型和浮点型变量都有其存储和运算的限制,例如32位整型最大只能表示到2^31 - 1,而浮点型也有其精度...

    2021-11-22 C语言学习应用——用C语言实现大数相乘(csdn)————程序.pdf

    总结部分,作者提到虽然C语言实现大数相乘比较繁琐,需要自定义函数,但其他如C++、Java和Python等语言提供了更方便的库函数来处理大数。这个过程是学习和理解大数运算原理的好方法。 总之,这篇教程详细介绍了如何...

    大数相乘算法,java代码,包含独立大数相加算法

    大数相乘算法,java代码,包含独立大数相加算法 其中bigNumberPlus(String s1,String s2)为大数相加方法 bigNumberMultiply(String s1,String s2)为大数相乘方法

    大数相乘指数幂的实现

    本主题主要探讨如何高效地实现大数相乘和大数的指数幂运算。 首先,我们要理解大数的概念。在计算机科学中,标准整型数据类型(如int或long)通常有固定的存储限制,例如32位或64位,能表示的数值范围有限。当需要...

    JAVA大数相乘

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

    JAVA实现大整数相乘

    本篇将深入探讨如何利用Java实现两个大整数的相乘,尤其是面对1000位以上的数字时的高效算法。 首先,Java标准库提供了`java.math.BigInteger`类,它专门用于表示和操作任意大小的整数。`BigInteger`类支持所有基本...

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

    标题中的"mul.zip_Mul(ti)住宅_mul的范围_大数相乘"暗示了我们正在讨论一个涉及大整数乘法的场景,可能是一个软件或算法实现。在描述中提到,“数字比较大,相乘的结果超出了基本类型的表示范围,不能够直接做乘法...

    动态数组实现大数乘法

    两个大数相乘:利用数组实现,数组a存放大数1的每一位,数组b依次存放大数2的每一位。如:一大数1为3463546,则数组 a[]={3,4,6,3,5,4,6},大数2为:89019 则数组b[]={8,9,0,1,9},现在要大数1和大数2相乘,并按数位...

    任意大的两个数相乘

    在实际编程中,处理大数相乘通常会用到特定的库,如Java的`BigInteger`类,Python的`int`类型(自动支持大数),或者C++的`GMP`库等。这些库提供了方便的API来进行大数运算,包括乘法。 例如,在Python中,我们可以...

    Calculate.rar_大数

    `Calculate.java`文件可能是实现大数相乘的一个Java源代码文件。在这个程序中,可能包含了对`BigInteger`对象的操作,比如创建大数实例、两个大数的乘法运算,以及可能的错误处理和性能优化。`BigInteger`类的乘法...

    java练习_大数运算_BigInteger.pdf

    Java大数运算 BigInteger 类的方法调用 正如我们在 Java 中处理大数运算时,需要使用 BigInteger 类来实现,这是因为 Java 的基本数据类型无法存储非常大的数字。BigInteger 类提供了几个重要的方法来进行大数运算...

    大数加法·乘法可以计算超长的数字

    1. **初始化:** 创建一个足够长的数组用于存储两个大数相乘的结果。 2. **逐位相乘:** 从最低位开始,逐位对两个大数进行相乘。 3. **进位处理:** 对于每次相乘的结果,如果其值大于等于10,则需要将其拆分为个位...

    大数加减乘类的实现

    大数的乘法相对复杂一些,常见的算法有Karatsuba算法和Toom–Cook算法,这里我们可能采用了更基础的“学校乘法”方法,也就是将一个大数拆分为多个位,然后分别与另一个大数相乘,再将结果相加并适当调整位数。...

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

    本文将详细介绍如何实现一个简单的Java大数乘法,包括浮点数的乘法运算。 首先,大数乘法的基本思想是将大数分解为单个数字,然后按照常规乘法规则逐位相乘。在Java中,我们可以使用字符串来存储这些大数,因为字符...

    大整数相乘算法 分治法

    本算法采用分治法(Divide and Conquer)来实现大整数的相乘。分治法是一种将复杂问题分解为更小的子问题来解决的策略。在这个问题中,我们将每个大整数分为两部分,每部分长度为原整数长度的一半。然后,对这些部分...

    关于大数的运算,有详细的注释和讲解,用C语言实现

    5. **大数乘法实现**:通过嵌套循环来实现两个大数相乘,外层循环遍历第一个大数的每一位,内层循环遍历第二个大数的每一位。每次迭代将对应位的乘积累加到结果的对应位上,并处理进位。 ```c bigfloat b_c...

    大数实现的椭圆曲线(ECC)加解密算法

    在C++中实现ECC,首先要实现大数计算模块。大数运算包括加、减、乘、除以及模运算,这些在处理超过标准整型范围的大数时是必需的。可以使用动态分配的数组来存储大数,然后设计相应的算法来处理这些操作。例如,可以...

Global site tag (gtag.js) - Google Analytics