2017-01-04 37 views
0

我想解决项目欧罗第三,但我很乱,逻辑停止计算。问题尝试项目欧罗#3

这里是项目欧拉三:

的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); 

} 

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

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

对不起,我很卡住:)谢谢!

+0

为'number = 63'工作,您将获得最高因子为'4',但最高因子为'7'。检查你的条件退出'do while loop'。 –

+0

[这里是你的答案](http://stackoverflow.com/questions/24772139/largest-prime-factor-euler-project?rq=1) –

回答

1

与逻辑的主要问题是要尽快,因为它击中了一些这是素数,你的程序停止给定数量的因素从最小素数,。 你应该做的是从另一端开始。正如我们所知道的一些任意素因子不会比数的平方根更大,所以你可以做的是:

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

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

System.out.println(i); 

有对600851475143其他变化,这将不适合在INT所以尝试长时间使用你正在做的计算。

这是我对这个问题的解决方案,它不是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; 
} 
}