class LargestPrimeFactor{
public static void main(String args[]){
long p=0L;
long n=600851475143L;
for(long i=2L;i<(n/2);i++){
if((BigInteger.valueOf(i)).isProbablePrime(1)){
if(n%i==0){
p=i;
}
}
}
System.out.println(p);
}
}
它是problem 3 from Project Euler。我编译它并没有出现任何错误。但我没有得到任何输出。是什么原因?
答案 0 :(得分:1)
它正在工作(只需在循环中添加一个打印方法来检查我)
您目前正在使用Brute-Force方法:
http://www.mathblog.dk/project-euler-problem-3/
如果您访问该链接,该人会告诉您替代解决方案。
我在没有太多了解这个问题的情况下看到的问题是
您目前所做的操作太多了
你得到了价值&#34; 600851475143
&#34;存储在long数据类型中,并尝试
使用int i(for-loop中的计数器)到达一半(300425737571,5
)。
https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#MAX_VALUE
这告诉我们:&#34;一个保持int可以具有的最大值的常量,
2^(31)-1." = 2147483647
这只是你实际需要的0,00715 (0,7%)
因此,这会导致我们进入&#34;溢出&#34;
考虑使用替代方法(第一个链接)
并将你的for循环的计数器改为&#34; long&#34;。
答案 1 :(得分:0)
int最大值为2147483647,小于600851475143/2
当索引i达到最大值时,它将回绕并以负数开头(-2147483648)
你应该使你的索引成为一个很长的值
答案 2 :(得分:0)
<强> EDITED 强>
int
数据类型可以存储最多2,147,483,647的值。要存储超出该数字的数字,请使用long
。
long n = 600851475143L;
不是600851475143 L
,因为L
之前的一个空格导致系统没有注册它。
此外,for循环中的int i
应为long i
。
答案 3 :(得分:0)
在第二次循环中有一个无限循环,只有在循环结束前添加日志记录时才能看到它。这并不是因为它没有打印这个值,当你盯着控制台时,迭代器仍在盘旋6857。
尝试使用下面的额外日志记录运行代码。
public static void main(String args[]) {
int p = 0;
long n = 600851475143L;
for (int i = 2; i < (n / 2); i++) {
if ((BigInteger.valueOf(i)).isProbablePrime(1)) {
if (BigInteger.valueOf(n % i).compareTo(BigInteger.valueOf(0)) == 0) {
p = i;
System.out.println("Check == true Iteration"+p);
}
System.err.println("Second iterator"+p);
}
}
System.out.println("Final Value of P: "+p);
}