发布尝试项目euler#3

时间:2017-01-04 05:05:57

标签: java logic

我正在尝试解决第三个项目的问题,但我对于停止计算的逻辑很不满意。

以下是Project Euler第三名:

  

13195的主要因素是5,7,13和29。

     

600851475143号码的最大主要因素是什么?

好吧,我创建了一个函数来检查数字是否为素数:

public static boolean isPrime(int number) {
    if (number % 2 == 0)
        return false;

    for (int i = 3; i*i <= number; i+=2) {
        System.out.println("Dividing the number " + number + " by: " + i);
        if (number % i == 0)
            return false;
    }
    return true;
}

检查素数是否是数字因子的函数:

 public static boolean isFactor(int number, int prime) {
    if (number % prime == 0)
        return true;
    else
        return false;
}

唯一的问题是主要功能,我正在尝试这样的事情:

 public static void main(String[] args) {

    int number = 13195;
    int i = 3;

    do {
        i++;
    } while (isPrime(i) && isFactor(number, i) == false);

    System.out.println(i);

}

我知道逻辑不正确,但我真的坚持了一个多小时。

我知道这里的主要目标是循环,找到一个素数并检查这个素数是否是数字的一个因子并找到最大值,但停止条件是如果循环数是素数且不是数量因素。

对不起,我很困惑:)谢谢!

3 个答案:

答案 0 :(得分:2)

你的逻辑的主要问题是你从最小的素数开始,一旦它击中一个素数和一个给定数量的因子你的程序停止。 你应该做的是从另一端开始。我们知道数字的任何素数除数都不会大于数字的平方根,所以你可以这样做:

int number = 13195;
int i = (int)Math.sqrt(number);

do {
    i--;
} while (isPrime(i) && isFactor(number, i) == false);

System.out.println(i);

对于600851475143还有其他更改,这将不适合int,因此尝试使用long来进行计算。

这是我对这个问题的解决方案,它不是100%正确,但它适用于这个问题。

public static void main(String[] args) {
    long number= 600851475143L;
    int rootOfNumber = (int)Math.sqrt(number)+10;
    for(int i = rootOfNumber; i > 2; i--) {
        if(number % i == 0) {
            if(psudoprime(i)) {
                System.out.println(i);
                break;
            }
        }
    }

}

public static boolean psudoprime(int num) {
    for(int i = 2; i < 100; i++) {
        if(num % i == 0) {
            return false;
        }
    }
    return true;
}

答案 1 :(得分:0)

public class LargestPrimeFactor {
private long num;
public LargestPrimeFactor(long num){
    this.num=num;
}
public long calculate(){
    for(long i=1;i<=num/2;i++)
        if(num%i==0)
            if(isPrime(num/i)) 
                return num/i;

    return 1;
}
private static boolean isPrime(long num){
    for(long i=2;i<=(long)Math.sqrt(num);i++){
        if(num%i==0) return false;
    }
    return true;
}
}

答案 2 :(得分:-1)

主代码中的循环在找到所述数字的第一个除数后停止。相反,我们必须消除所有这些主要的除数,直到我们达到其中最大的除数。 我不愿意在这里分享任何代码,因为这个问题非常具体。不要在出现主要除数时打破循环,而是尝试列出所有这些。

希望这有帮助。