需要一个更大的原始类型的整数

时间:2013-09-02 19:53:43

标签: java long-integer

我有一个java程序,可以乘以大数字。输出是long,但它太小了,输出为0.我认为没有更大的原始类型。

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

以下是代码行:

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类,而且它太大了。

是否有更长的数字类仍然可以使用*/?或者是否有另一个更容易使用的数字类?

感谢。

2 个答案:

答案 0 :(得分:2)

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

现在,Java改变了这一点,并将这些类型修改为一定长度,无论处理器架构如何。 See more info here

如果您需要处理较大的数字,则只能使用BigIntegerBigDecimal和类似内容。请注意:这些类型不使用CPU指令,而是“手动”进行数学运算,这意味着它们相当慢(想想1000倍)。

另一方面,您所说的内容 - 将*/与这些类型一起使用称为operator overloading。一些编程语言支持它,但在Java中它是一个很大的禁忌。有一些预编译器(参见JFront),但最后我听说它不适用于BigInteger

您可以在GroovyScala编写程序 - 这些都在JVM上运行(Groovy的语法与Java非常相似 - 大多数只是将.java重命名为.groovy工作)并且都支持BigInteger的运算符重载。

答案 1 :(得分:1)

您可以尝试使用double,它大于long,并且只使用整数部分。

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

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