相当容易,如果BigInteger数为543我希望它切断了最后一位数字,所以,它是54.

两个简单的方法来做到这一可以是:

  1. 使用的字符串,获得substring和创建新的biginteger与新的价值。
  2. 使用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执行情况真是奇怪的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top