我试图解决项目Euler problem 3,即:
13195的主要因素是5,7,13和29。 数字600851475143的最大主要因素是什么?
这是我的解决方案,它适用于较小的值,但不知道如何完成所需的数字:
public class Pro3 {
public static void main(String[] args) {
long l=600851475143L;
for(long lo=l/2;lo>=2;lo--){
if(l%lo==0 && isPrime(lo)==true){
System.out.println(lo);
break;
}
}
}
static boolean isPrime(long x){
for(int i=2;i<=Math.sqrt(x);i++){
if(x%i==0){
return false;
}
}
return true;
}
}
答案 0 :(得分:1)
你可以试试这种方式
public static List<Double> primeFactors(double numbers) {
double n = numbers;
List<Double> factors = new ArrayList<>();
for (int i = 2; i <= n / i; i++) {
while (n % i == 0) {
factors.add((double) i);
n /= i;
}
}
if (n > 1) {
factors.add(n);
}
return factors;
}
public static void main(String[] args) {
List<Double> result=primeFactors(600851475143d);
System.out.println("largest prime factor is :" + result.get(result.size()-1));
}
输出:
largest prime factor is :6857.0
答案 1 :(得分:0)
将lo
的起始值设置为Math.sqrt(l) + 1
,将其更改为int
类型,它应该可以正常工作,因为它正是我所做的。最好的猜测我可以想出代码中的错误是使用32位ALU和整数溢出。
package page1;
import euler.Common;
/**
* @author Obicere
*/
public class Euler003 {
public static void main(final String[] args){
long number = 600851475143L;
int maxRange = (int) Math.sqrt(number) + 1;
for(int i = maxRange; i >= 2; i--){
if(number % i == 0 && Common.isPrime(i)){
System.out.println(i);
break;
}
}
}
}
public static boolean isPrime(final int num) {
if (num < 2) {
return false;
}
if (num == 2) {
return true;
}
for (int i = 2; i <= (int) Math.sqrt(num) + 1; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}