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