Java 将大整数打印到文本文件

Java 将大整数打印到文本文件,java,performance,biginteger,println,Java,Performance,Biginteger,Println,我正在用Java计算非常大的阶乘。但是,当我试图将它们写入文本文件时,需要花费太多的时间。我用这种方法来打印数字 PrintWriter writer = new PrintWriter(index + "!.txt", "UTF-8"); writer.println(number); writer.close(); 打印10000!到一个文本文件需要194毫秒。文件大小为35.7KB 打印100000!创建文本文件需要24314毫秒。文件大小为456.6 kB 我认为这个文件大小的速度太慢

我正在用Java计算非常大的阶乘。但是,当我试图将它们写入文本文件时,需要花费太多的时间。我用这种方法来打印数字

PrintWriter writer = new PrintWriter(index + "!.txt", "UTF-8");
writer.println(number);
writer.close();
打印10000!到一个文本文件需要194毫秒。文件大小为35.7KB

打印100000!创建文本文件需要24314毫秒。文件大小为456.6 kB


我认为这个文件大小的速度太慢了。如何在几秒钟内打印出百万位数的大整数?是否有更快的方法或任何方法可以对此进行优化?

您观察到的时间是由于biginger.toString(),而不是写入文件

将looong BigInteger转换为十进制(或任何其他基)数字序列是一个麻烦的过程,需要将looong int[]除以基,并以相当间接的方式组合结果字符串,甚至使用StringBuilder。(我刚刚检查过:1.8使用了改进的算法,但35k或456k数字还有很长的路要走。)

我曾经遇到过这个问题,最后编写了自己的BigInteger,使用了一种可以很快转换为10进制的表示法


如果选择另一个库,请确保它允许修改对象(而不是返回新对象)的操作。如果您希望频繁/长时间转换为十进制字符串,请尝试找到一个以10的整数幂为基数表示数字的字符串。

Java的BigInteger对于非常大的数字没有很好的优化。因此,如果您想获得性能,您需要使用不同的库。@神秘的是,这里真正具有破坏性的是对字符串的转换,请参见我的答案。24314毫秒=>24314秒,更有可能。@laune是的,我知道这一点。Java BigInteger仍然使用
O(N^2)
算法。他们还没有实现
O(N*log(N)^2)
算法。@laune看起来将是
O(N^1.465*log(N)^2)
。虽然它没有最先进的(
O(N*log(N)^2)
)那么快,但它比当前的
O(N^2)
好得多。OT:有趣。你自己的BigInteger本身不是以10为基数的吗?@Jongware有
base=100000000在该代码中。足以测试7008位数字是否为素数,以及其他一些涉及二进制计算和十进制表示之间来回的跳跃。我不认为这对每个基数都是正确的。事实上,我非常肯定,当使用“2的幂”基数时,它将(或可以)工作得更快,因为在这种情况下不需要除法运算。@barakmanos有趣。你有这样一个算法的链接吗?例如,将Java long转换为十进制数字的字符串?@laune:我说的是“2的幂”基(例如-16)。小数基数不包括在该类别中!!!