Java BigInteger,切断了最后一位数字
-
16-09-2019 - |
题
相当容易,如果BigInteger数为543我希望它切断了最后一位数字,所以,它是54.
两个简单的方法来做到这一可以是:
- 使用的字符串,获得substring和创建新的biginteger与新的价值。
- 使用BigIntegers鸿沟的方法与10号。( 543 / 10 = 54.3 => 54 )
事实是我将要执行这 很多 次与大整数的课程。
我的猜测是,玩弄串将以较慢,但然后我再没有使用Bigintegers这么多,不知道如何昂贵的"鸿沟"操作。
速度是必不可少的在这里,什么是最快的方式实施这一(存储器有问题仅有的速度)?
其他解决方案也是值得欢迎的。
解决方案
除10速度远远超过使用一串的动作。使用下述基准,我得到有关161x次(比例成正比的位计数)
long divTime = 0;
long substrTime = 0;
final int bitsCount = 1000;
for (int i = 0; i < 1000; ++i) {
long t1, t2;
BigInteger random = new BigInteger(bitsCount, new Random());
t1 = System.currentTimeMillis();
random.divide(BigInteger.TEN);
t2 = System.currentTimeMillis();
divTime += (t2 - t1);
t1 = System.currentTimeMillis();
String str = random.toString();
new BigInteger(str.substring(0, str.length() - 1));
t2 = System.currentTimeMillis();
substrTime += (t2 - t1);
}
System.out.println("Divide: " + divTime);
System.out.println("Substr: " + substrTime);
System.out.println("Ratio: " + (substrTime / divTime));
其他提示
除10个是最有可能将会更快。
如果创建一个BigInteger静,有10号,然后使用,除10,这将是可能最快的方式做到这一点。它打败创建一个临时的新BigInteger每次。
该问题与子串的是,你本质上是创建一个新的串每一次,那是慢得多,更不要说缓慢,是迭代过一个字符串获得其子串。
最快的方法是分割的数量由10个高效的内部司执行。内部,工作是幕后但绝非微不足道,因为该数字存储的基-2.
尽可能最快的执行可能会使用的数据类型的内部表示,采用基10,即某种 BCD.然后,司通过10只会意味着删除最后一个字节(或甚至只是递增/减量的一个指标如果实施它的正确方式)。
当然,你必须要实现所有算术及其他行动你需要从头开始,使得这大量的工作。
它可能为时过早,甚至可以问这个问题。这样做显而易见的方法(除十),然后基准,并优化它,如果您需要。转换到一串的代表性和回将慢得多。
ToString()单独的可能是慢于子串。
各种人都说,除以10将快于转换到一串并采取子串。要了解为什么,只是认为有关计算中涉及的转换从BigInteger要一串,反之亦然。例如:
/* simplified pseudo code for converting +ve numbers to strings */
StringBuffer sb = new StringBuffer(...);
while (number != 0) {
digit = number % 10;
sb.append((char)(digit + '0'));
number = number / 10;
}
return sb.toString();
重要的是要注意的是,转换从一数到一串需要反复地划分的10个。事实上分割的数量成比例log10(数量)。在其他方向涉及log10(数量)次乘法。这应该是显而易见的,这是更计算比一个单一的司,由10.
如果业绩是至关重要的。不用java
在语言编制的机器码(例如c或c++)整数分是快通过一个巨大的因素。串操作使用(或者可以使用的)存储器的拨款,因此缓慢。
我的打赌是,在java int部门将以更快。否则他们vm执行情况真是奇怪的。