/ / Разбиране на проблемите на кода [затворен] - java

Разбиране на проблеми на код [затворен] -

Правя Project Euler и се заседнахпроблем 3. След 2 часа опит за направа на Java програма напразно, аз гуглих отговора, но не мога да разбера няколко неща. Съжалявам, ако задавам глупави въпроси, но аз съм noob и наистина искам да уча.

public static void main(String[] args) {
long x = 600851475143L;
long biggest = 0L;

for (long i = 2L; i <= x; i++) { // <- HERE, WHY 2L and NOT 1L ?
for (long l = 1L; l <= Math.sqrt(i); l++) { //  <-  HERE, why Math.sqrt(i) ?????
if (l % i == 0) {
break;
} else {
while (x % i == 0) {
x = x / i; // <- Why x/i ???
biggest = i;
}
}
}
}
System.out.println(biggest);
}

Отговори:

2 за отговор № 1

Нека разгледаме текста на Проблем 3 на Project Euler:

Основните фактори на 13195 са 5, 7, 13 и 29.

Кой е най-големият първичен коефициент на числото 600851475143?

Като знаете това, първото нещо, което трябва да знаете за основните фактори, е:

  1. Те трябва да са просто число.
  2. 1 не е основен фактор.

Освен това, най-големият коефициент на число не може да бъде по-висок от квадратния му корен.

Като знаем тези данни, можем да започнем да работим върху нашия алгоритъм. Настоящото решение предлага това:

//i are the possible factors for the number
for (long i = 2L; i <= x; i++) { // <- HERE, WHY 2L and NOT 1L ?
//answer: because 1 is not the first possible prime factor, is 2
for (long l = 1L; l <= Math.sqrt(i); l++) { //  <-  HERE, why Math.sqrt(i) ?????
//answer: the largest factor of a number cannot be higher than its square root
if (l % i == 0) {
break;
} else {
while (x % i == 0) {
x = x / i; // <- Why x/i ???
//if i is a factor of x, mark it as the current biggest factor
biggest = i;
}
}
}
}

.


Обърнете внимание, че квадратният корен от 600851475143 е 775146.09922 ..., закръглен надолу до 775146, което означава, че можете да преформулирате проблема на: Кое е най-голямото първоначално число по-ниско от 775146, което е коефициент 600851475143?, С това можете да опитате други алгоритми, за да получите отговора на проблема по-горе.

Едно по-добро решение би било получаването на коефициентите на 600851475143, като се започне от 775146 до 2, след което се провери дали коефициентът е основно число. Първият основен фактор ще бъде желаният отговор.