关于BigInteger的问题?

时间:2013-06-16 22:35:50

标签: java biginteger

import java.math.BigInteger;
public class ProjectEuler {
    public static void main(String[] args) {
        BigInteger bi = new BigInteger("600851475143");
        int div = 7;
        while (bi.compareTo(new BigInteger("1")) != 0) {
            while (bi.mod(new BigInteger(div + "")).compareTo(new BigInteger("0")) == 0) {
                bi = bi.divide(new BigInteger(div + ""));
            }
            div += 2;
        }
        System.out.println("" + div);
    }
}

我只是在查看“ 600851475143 中最大的主要因素是什么”这个基本但着名的问题之一。我发现这个解决方案不同,我对这是如何工作有几个问题。

  1. 第一个条件检查数字是否等于1。从那里我无法理解其余的代码。
  2. new BigInteger(div +"")。为什么我们在这里连接+“”?

2 个答案:

答案 0 :(得分:2)

  

div = 7是如何决定的?

作者决定“硬编码”他对数字本身的知识,以确定前三个素数不在除数之中

  

第一个条件检查数字是否等于1。从那里我无法理解剩下的代码。

其余代码在“常规”整数中看起来像这样:

while (bi % div == 0) {
    bi /= div;
}
div += 2;
  

new BigInteger(div +"")为什么我们在这里连接+ ""

这是将对象设为String的简短方法。 BigInteger有一个带String的参数,因此这种方法的替代方法是调用Integer.toString(div)

请注意,这不是最有效的解决方案:人们可以通过观察当你达到原始数字的平方根时停止尝试除法来加快速度,因为你可以确定下一个除数将是数字本身。

答案 1 :(得分:1)

  

div = 7是如何决定的?

作者可能注意到这个数字不能被2除3或5整除。要知道作者是如何做到的,他/她应该知道这个规则:Divisibility Rules and Tests

  

第一个条件检查数字是否等于1。从那里我无法理解剩下的代码。

作者确保该数字不是BigInteger("1"),因为它除了数字并将结果存储在循环迭代中的bi中。请注意:

bi = bi.divide(new BigInteger(div + ""));
  

new BigInteger(div +"")。为什么我们在这里连接+“”?

它使用BigInteger(String)构造函数。作者n̶a̶i̶v̶e̶l̶y̶通过添加Stringint来制作新的String