Java中有啥方法能使大于long 的两个数相乘???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中有啥方法能使大于long 的两个数相乘???相关的知识,希望对你有一定的参考价值。

比如:4567664132134576465465413541*4564654132134543543132
随便输入两个大于Long型的数,有什么方法能相乘~!

建议自己写一个乘法函数去处理,采用字符数组存储你输入的要计算的两个数,结果也以字符数组给出。具体的计算可以按照它们的ASCII码进行计算,按10进制乘法规则,自己写一个函数。以前写过。 参考技术A 有两种方法,第一是你把他们扩展成范围更大的double型
方法二:是采用数组存储,数组一位存一个数字,那么理论上可以计算很大很大的数了
参考技术B String v1 = "11111111111111111111111111111111111";
String v1 = "22222222222222222222222222222";

BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).toString();
参考技术C 把他们定义成DOUBLE型的

将大于 long double 最大限制的 2 个数字相乘 [关闭]

【中文标题】将大于 long double 最大限制的 2 个数字相乘 [关闭]【英文标题】:multiply 2 numbers that are bigger than maximum limit of long double [closed] 【发布时间】:2013-08-03 09:31:59 【问题描述】:

如何使用 C++/C 例如将大于最大限制的 2 个数字相乘,即 1.89731e+4932long double2.79654E+256783.89574e+35890 ...

【问题讨论】:

你的尝试在哪里?? 我想不出办法..这是一个作业问题,非常需要一个解决方案 作业应该被尝试...他们是有原因的。 你得到了科学计数法的数字。提示:你可以使用它。 【参考方案1】:

有两种可能性(C# 示例):

您可以使用 BigInteger(在您的情况下似乎效率低下,但使用高精度数字很方便)

BigInteger a = 279654 * BigInteger.Pow(10, 25678 - 5); // <- 2.79654E25678 = 279654E25678 * 1E-5
BigInteger b = 389574 * BigInteger.Pow(10, 35890 - 5); // <- 3.89574E35890 = 389574E35890 * 1E-5
BigInteger result = a * b;

您可以分别操作尾数和指数:

Double mantissaA = 2.79654;
int exponentA = 25678;

Double mantissaB = 3.89574;
int exponentB = 35890;

Double mantissaResult = mantissaA * mantissaB;
int exponentResult = exponentA + exponentB;

// Let's adjust mantissaResult, it should be in [1..10) (10 is not included) range
if ((mantissaResult >= 10) || (mantissaResult <= -10))  
  mantissaResult /= 10.0 
  exponentResult += 1; 

else if (((mantissaResult < 1) && (mantissaResult > 0)) || ((mantissaResult > -1) && (mantissaResult < 0)))  
  mantissaResult *= 10.0 
  exponentResult -= 1;  


// Let's output the result
String result = mantissaResult.ToString() + "E+" + exponentResult.ToString();

附:通常在乘法的情况下,使用 对数 和加法会更方便:

A * B -> Log(A) + Log(B)

【讨论】:

@harold:感谢您的改进;我已经编辑了代码以添加尾数调整

以上是关于Java中有啥方法能使大于long 的两个数相乘???的主要内容,如果未能解决你的问题,请参考以下文章

大数相乘-蛮力法

快速幂取模(当数很大时,相乘long long也会超出的解决办法)

将大于 long double 最大限制的 2 个数字相乘 [关闭]

两个质数相乘的积一定是啥数

两个超级大整数的相加,相乘

大数求阶乘(防溢出)