2

我有一个乘以大数的java程序。输出是a long,但是太小了,输出为0。我觉得没有更大的原始类型。

我可以这样做的方法是使用BigInteger类,但是我必须使用它的multiply()divide()方法而不是常规的*and /,这将非常不方便。

这是代码行:

System.out.printf("c) In how many of the arrangements in part (a) are all the vowels adjacent?%n    " + "(7! / (2!2!))(6! / 3!2!) = " + (new Factorial(7).r / new Power(new Factorial(2).r,2).r) * (new Factorial(6).r / (new Factorial(6).r * new Factorial(2).r)) + "%n");

它正在使用我的FactorialPower类,它太大了。

是否有更长的数字类仍然可以使用*and /?还是有其他更容易使用的数字类?

谢谢。

4

2 回答 2

2

原始类型(byte、short、int、long)是经典类型,通常——在其他语言(想想 C、C++)中——由处理器架构定义。所以 long 将是 16 位、32 位或 64 位,具体取决于您的 CPU 类型。

现在 Java 改变了这一点,并将这种类型固定为一定的长度,而不管处理器架构如何。在此处查看更多信息

如果您需要处理更大的数字,您只剩下BigInteger,BigDecimal和类似的。请注意:这些类型不使用 CPU 指令,而是“手动”进行数学运算,这意味着它们非常慢(想想 1000 倍)。

另一方面,您所说的 - 使用*/处理这些类型称为运算符重载。一些编程语言支持它,但在 Java 中这是一个很大的禁忌。有一些预编译器(请参阅JFront),但最后我听说它不适用于BigInteger.

您可以使用GroovyScala编写程序——它们都在 JVM 上运行(Groovy 的语法与 Java 非常相似——主要是将 .java 重命名为 .groovy 工作)并且都支持运算符重载BigInteger

于 2013-09-02T20:06:49.903 回答
1

您可以尝试使用比 long 更大的 double,并且只使用整数部分。

否则,您可以创建自己的整数类,其中将包含两个或三个长整数,然后使用移位和按位运算符来处理数学运算,但这并不容易。

最后一种解决方案可能是使用非常大的整数编写 c++ 代码并将生成的 exe 与 java 一起使用,但这种解决方案会破坏代码的可移植性。

于 2013-09-02T20:07:54.147 回答