我正在尝试解决第三个项目的问题,但我对于停止计算的逻辑很不满意。
以下是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);
}
我知道逻辑不正确,但我真的坚持了一个多小时。
我知道这里的主要目标是循环,找到一个素数并检查这个素数是否是数字的一个因子并找到最大值,但停止条件是如果循环数是素数且不是数量因素。
对不起,我很困惑:)谢谢!
答案 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)
主代码中的循环在找到所述数字的第一个除数后停止。相反,我们必须消除所有这些主要的除数,直到我们达到其中最大的除数。 我不愿意在这里分享任何代码,因为这个问题非常具体。不要在出现主要除数时打破循环,而是尝试列出所有这些。
希望这有帮助。