Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于大整数的问题?_Java_Biginteger - Fatal编程技术网

Java 关于大整数的问题?

Java 关于大整数的问题?,java,biginteger,Java,Biginteger,我刚才在看一个基本但著名的问题“数字600851475143的最大素因子是什么”。我发现这个解决方案不一样,我有几个问题想问一下它是如何工作的 第一个条件检查数字是否等于1。从那里我无法理解代码的其余部分 新建大整数(div+“”)。为什么要在这里连接+ 如何确定div=7 可能作者注意到这个数字不能被2、3或5整除。要知道作者是如何做到这一点的,他/她应该知道以下规则: 第一个条件检查数字是否等于1。从那里我无法理解代码的其余部分 作者要确保数字不是biginger(“1”),因为它在循环迭代

我刚才在看一个基本但著名的问题“数字600851475143的最大素因子是什么”。我发现这个解决方案不一样,我有几个问题想问一下它是如何工作的


  • 第一个条件检查数字是否等于1。从那里我无法理解代码的其余部分
  • 新建大整数(div+“”)
    。为什么要在这里连接+
  • 如何确定div=7


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


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

    作者要确保数字不是
    biginger(“1”)
    ,因为它在循环迭代中除以数字并将结果存储在
    bi
    中。请注意:

    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);
        }
    }
    
    新建大整数(div+“”)
    。为什么要在这里连接+

    它使用构造函数。作者n̶a̶i̶v̶e̶l̶y̶通过将
    int
    与空
    字符串
    相加,生成一个新的
    字符串

    如何确定div=7

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


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

    代码的其余部分在“常规”整数中如下所示:

    bi = bi.divide(new BigInteger(div + ""));
    
    新的BigInteger(div+“”)
    为什么要在这里连接
    +“”

    这是使对象成为
    字符串的一种简单方法
    BigInteger
    有一个参数采用
    String
    ,因此这种方法的替代方法是调用
    Integer.toString(div)


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

    可能作者注意到数字不能被2、3或5整除。这不是火箭科学。@LuiggiMendoza:几秒钟内两次否定……”“从那以后,我无法理解其余的代码。”-你有没有试着咨询过?如果是这样的话,你还有什么不明白的地方吗?@LuiggiMendoza这就提出了一个愚蠢的问题:这会不会成为这个项目Euler问题的最快答案?对你事先计算的结果进行硬编码?@Vinothbabu你把几个评论混在一起了。“愚蠢”的问题是我提出的。OP的问题只是低质量-非常模糊,没有显示自己的研究,等等@太好了,你能再解释一下最后一段吗,“当你到达原始数字的平方根时,你可以停止尝试除法,因为你可以确定下一个除数将是数字本身,这样可以加快计算速度。”@Kevin这里有更好的解释:
    while (bi % div == 0) {
        bi /= div;
    }
    div += 2;