Я пытался сделать способ сделать первую факторизацию числа, и он, вероятно, не самый эффективный, но я не понимаю, почему он не должен работать.Что не так с этим простым кодом факторизации в Java?
public static ArrayList<Integer> primeFactorize(int num) {
ArrayList<Integer> primeFactors = new ArrayList<Integer>();
for (int i = 2; i < Math.sqrt((double) num); i++) {
if (isPrime(i) && factor(num).contains(i)) {
primeFactors.add(i);
num /= i;
if (isPrime(num)) {
primeFactors.add(num);
break;
}
i = 2;
}
}
return primeFactors;
}
Он призывает двух других методов, которые я написал по имени factor()
и isPrime()
, которые делают именно то, что вы ожидали бы их (возвращает ArrayList
факторов и либо true
или false
в зависимости от того, если вход первична, соответственно).
Я прошел через отладчик с num
, равным 12, и он отлично работал для первого цикла, где он добавил 2 к primeFactors
. Однако, когда он снова попал в верхнюю часть массива с num
, равным 6, а i
- 2, он вышел из цикла, как если бы i < Math.sqrt((double) num)
вернулся false
.
Но это не имеет смысла, потому что квадратный корень из 6 немного больше 2. Я также пробовал (double) i < Math.sqrt((double) num)
, но он просто сделал то же самое.
Может ли кто-нибудь увидеть, что мне не хватает? Спасибо за любые ответы.
EDIT: Вот мой код сейчас, спасибо за помощь! Я точно знаю, что могу сделать его более эффективным, поэтому я мог бы это сделать позже, но пока это прекрасно.
public static ArrayList<Integer> primeFactorize(int num) {
ArrayList<Integer> primeFactors = new ArrayList<Integer>();
int i = 2;
while (i < Math.sqrt((double) num)) {
if (isPrime(i) && num % i == 0) {
primeFactors.add(i);
num /= i;
if (isPrime(num)) {
primeFactors.add(num);
break;
}
i = 2;
}
else
i++;
}
return primeFactors;
}
sqrt (num), а не sqrt (i). Так что с num = 12, 6 больше, чем sqrt (num) – FredK