Эйлер задача 3
Задача 3
Наибольший простой делитель
Простые делители числа 13195 - это 5, 7, 13 и 29.
Каков самый большой делитель числа 600851475143, являющийся простым числом?
Решение golang
go run eiler3.go
6857
package main
import "fmt"
func main() {
n := 600851475143
//n = 13195
simple := true
for i, tmp := 2, 0; i < n; i++ {
if n%i != 0 {
continue
}
tmp = n / i
simple = true
for j := 2; j < tmp; j++ {
if tmp%j == 0 {
simple = false
break
}
}
if !simple {
continue
}
fmt.Println(tmp)
break
}
}
А вот нормальное решение на питоне
num=600851475143
count=1
while num!=1:
count+=1
While num%count==0:#если число делится, то делим
num/=count
print(count)
Давайте разберем решение на Python шаг за шагом:
1. Задача состоит в нахождении наибольшего простого делителя числа 600851475143.
2. В коде Python переменная num инициализируется значением 600851475143, которое мы хотим разложить на простые множители.
3. Переменная count инициализируется значением 1. Она будет использоваться для проверки каждого числа на то, является ли оно делителем num.
4. Цикл while продолжается до тех пор, пока num не станет равным 1. Это означает, что мы разделили num на все его простые множители.
5. Внутри цикла while значение count увеличивается на 1 на каждой итерации. Это последовательно проверяет каждое число начиная с 2 (так как 1 не считается простым числом).
6. Условие if num % count == 0: проверяет, делится ли num на count без остатка. Если это так, значит count является делителем num.
7. Если count является делителем num, то num делится на count (операция num /= count), и мы продолжаем цикл уже с новым значением num. Это уменьшает num и убирает из него найденный простой множитель.
8. Поскольку мы начинаем с count = 2 и увеличиваем count на 1 на каждом шаге, мы всегда находим наименьший простой множитель на каждом этапе. Это означает, что когда num станет равным 1, последнее значение count будет наибольшим простым множителем исходного числа.
9. Когда num становится равным 1, цикл завершается, и print(count) выводит наибольший простой множитель.
Преимущество этого метода в том, что он не требует проверки каждого числа на простоту, что значительно ускоряет процесс. Мы просто делим num на наименьшие простые числа, пока не получим 1, и последнее использованное значение count будет наибольшим простым множителем.
package main
import "fmt"
func main() {
n := 600851475143
i := 1
//n = 13195
n = 10967
for n != 1 {
i++
if n%i == 0 {
n /= i
}
}
fmt.Println(i)
}