Правя 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 не е основен фактор.
Освен това, най-големият коефициент на число не може да бъде по-висок от квадратния му корен.
Като знаем тези данни, можем да започнем да работим върху нашия алгоритъм. Настоящото решение предлага това:
//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, след което се провери дали коефициентът е основно число. Първият основен фактор ще бъде желаният отговор.