我最近开始学习Java,现在我正在尝试解决一些Eulerproject问题。
任务是: 600851475143号码的最大素数因素是什么?
我能够创建此代码,但是我收到错误:
代码
package exercises;
import java.util.ArrayList;
public class Euler3 {
// Main code
public static void main(String[] args) {
System.out.println( getPrimeFactors(15) );
}
// Code for breaking a number to prime factors
public static ArrayList getPrimeFactors(int n){
ArrayList factors = new ArrayList();
int d = 2;
while(n > 1 ){
while(n%d == 0 ){
factors.add(d);
n /= d;
}
d +=d;
}
return factors;
}
}
错误:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at exercises.Euler3.getPrimeFactors(Euler3.java:22)
at exercises.Euler3.main(Euler3.java:9)
我做错了什么? 感谢
答案 0 :(得分:3)
对于一个非常天真的解决方案,请尝试将行d += d
更改为d += 1
。
答案 1 :(得分:3)
d
已溢出,我在n
内打印d
和while (n > 1)
:
15 2
15 4
15 8
15 16
15 32
15 64
15 128
15 256
15 512
15 1024
15 2048
15 4096
15 8192
15 16384
15 32768
15 65536
15 131072
15 262144
15 524288
15 1048576
15 2097152
15 4194304
15 8388608
15 16777216
15 33554432
15 67108864
15 134217728
15 268435456
15 536870912
15 1073741824
15 -2147483648
15 0
我认为解决方案是d++
,而不是d+=d
- 现在你只检查2的幂,而不是所有连续的整数。
答案 2 :(得分:1)
问题是您的d越过Integer.Max
限制并且溢出。