我有一个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");
它正在使用我的Factorial
和Power
类,而且它太大了。
是否有更长的数字类仍然可以使用*
和/
?或者是否有另一个更容易使用的数字类?
感谢。
答案 0 :(得分:2)
原始类型(byte,short,int,long)是经典类型,通常是 - 在其他语言中(想想C,C ++) - 由处理器体系结构定义。所以长的将是16位,32位或64位,具体取决于您的CPU类型。
现在,Java改变了这一点,并将这些类型修改为一定长度,无论处理器架构如何。 See more info here
如果您需要处理较大的数字,则只能使用BigInteger
,BigDecimal
和类似内容。请注意:这些类型不使用CPU指令,而是“手动”进行数学运算,这意味着它们相当慢(想想1000倍)。
另一方面,您所说的内容 - 将*
和/
与这些类型一起使用称为operator overloading。一些编程语言支持它,但在Java中它是一个很大的禁忌。有一些预编译器(参见JFront),但最后我听说它不适用于BigInteger
。
您可以在Groovy或Scala编写程序 - 这些都在JVM上运行(Groovy的语法与Java非常相似 - 大多数只是将.java重命名为.groovy工作)并且都支持BigInteger
的运算符重载。
答案 1 :(得分:1)
您可以尝试使用double,它大于long,并且只使用整数部分。
否则你可以创建自己的整数类,它将包含两个或三个长整数, 然后你使用shift和按位运算符来处理数学运算,但这并不容易。
最后一个解决方案可能是使用一个非常大的整数来编写c ++代码,并使用java生成的exe,但这个解决方案会破坏代码的可移植性。