Funktionale Programmierung in Python Project Euler 3

Problem 3 - Project Euler

"Maximaler Primfaktor"

Die Primfaktoren von 13195 sind 5, 7, 13, 29.

Finden Sie den größten der Primfaktoren von 600851475143.

Lösung

Beginnen Sie mit 2 und suchen Sie nach Faktoren in aufsteigender Reihenfolge. Wiederholen Sie dann rekursiv den Vorgang des Dividierens durch den Wert jedes Mal, wenn ein Faktor gefunden wird, um den größten Primfaktor zu finden. Wir verwenden eine funktionale Technik, um das erste Element zu finden, das der Bedingung entspricht, dass die als Argument empfangene Ganzzahl teilbar ist.

Funktion zum Finden des ersten Elements

Ich denke, es ist normal, dass funktionale Sprachen eine Funktion haben, die das erste Element findet, das einer bestimmten Bedingung entspricht.

Sprache Funktionsname
F# find
Scala find
C# (LINQ) First
Java 8 -

In Python gibt es keine ähnliche Funktion, daher müssen Sie vorhandene Funktionen kombinieren. Sie können das erste Element erhalten, indem Sie einen Iterator generieren, der nur diejenigen zurückgibt, die die Bedingungen mit der Filterfunktion erfüllen, und diesen Iterator an die nächste Funktion übergeben.

def find(condition, iterable):
    return next(filter(condition, iterable), None)

In der obigen Funktionsdefinition ist Bedingung die Funktion, die die Bedingung bestimmt, iterierbar ist ein Objekt wie eine Liste, und die letzte Keine ist der Wert, der zurückgegeben wird, wenn kein Element vorhanden ist.

Antwortbeispiel

Python_3.x


# -*- coding: UTF-8 -*-
from math import sqrt


def find(pred, iterable):
    '''Suchen Sie das erste Element, das den Kriterien entspricht. Gibt None zurück, wenn keine übereinstimmenden Elemente vorhanden sind.'''
    return next(filter(pred, iterable), None)


def getMaxPrimeFactor(n):
    '''Finden Sie den maximalen Primfaktor.'''
    #️ Finden Sie den kleinsten Faktor im Bereich von 2 bis √n.
    limit = int(sqrt(n))
    smallestFactor = find(lambda i: n % i == 0, range(2, limit + 1))
    if smallestFactor is None:
        #Gibt n zurück, wenn kein Faktor gefunden wird.
        return n
    else:
        #️ Wenn ein Faktor gefunden wird, rufen Sie rekursiv auf, indem Sie n durch den Faktor dividieren.
        return getMaxPrimeFactor(n // smallestFactor)


answer = getMaxPrimeFactor(600851475143)
print(answer)

Wenn Sie es mit Python 2.x ausführen, tritt ein Fehler auf, sodass Sie es korrekt ausführen können, indem Sie die Filterfunktion durch die ifilter-Funktion des itertools-Moduls ersetzen.

Python_2.x


# -*- coding: UTF-8 -*-
from math import sqrt
from itertools import ifilter


def find(pred, iterable):
    '''Suchen Sie das erste Element, das den Kriterien entspricht. Gibt None zurück, wenn keine übereinstimmenden Elemente vorhanden sind.'''
    return next(ifilter(pred, iterable), None)


def getMaxPrimeFactor(n):
    '''Finden Sie den maximalen Primfaktor.'''
    #️ Finden Sie den kleinsten Faktor im Bereich von 2 bis √n.
    limit = int(sqrt(n))
    smallestFactor = find(lambda i: n % i == 0, range(2, limit + 1))
    if smallestFactor is None:
        #Gibt n zurück, wenn kein Faktor gefunden wird.
        return n
    else:
        #️ Wenn ein Faktor gefunden wird, rufen Sie rekursiv auf, indem Sie n durch den Faktor dividieren.
        return getMaxPrimeFactor(n // smallestFactor)


answer = getMaxPrimeFactor(600851475143)
print(answer)

Recommended Posts

Funktionsprogrammierung in Python Project Euler 1
Funktionale Programmierung in Python Project Euler 3
Funktionsprogrammierung in Python Project Euler 2
[Hinweis] Project Euler in Python (Problem 1-22)
Projekt Euler # 5 "Minimum Multiple" in Python
Programmieren mit Python
Projekt Euler # 15 "Gitterpfad" in Python
Projekt Euler # 4 "Maximale Kalligraphie" in Python
Projekt Euler # 3 "Maximale Primfaktoren" in Python
Projekt Euler # 11 "Maximales Produkt im Raster" in Python
Projekt Euler # 7 "1000 1. Primzahl" in Python
Projekt Euler # 16 "Summe der Kräfte" in Python
Projekt Euler # 9 "Spezielle Pitagolas-Nummer" in Python
Projekt Euler # 14 "Längste Spalte mit Kollatennummern" in Python
Probieren Sie eine funktionale Programmierpipe in Python aus
Projekt Euler # 2 "Gerade Fibonacci-Zahl" in Python
Projekt Euler # 17 "Anzahl der Zeichen" in Python
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
Python-Programmierung mit Excel
Was ist "funktionale Programmierung" und "objektorientiert"? Python Edition
Projekt Euler # 10 "Summe der Primzahlen" in Python
Projekt Euler # 12 "Hochangepasste Dreiecke" in Python
Projekt Euler # 13 "Summe großer Zahlen" in Python
Projekt Euler # 6 "Differenz in der Summe der Quadrate" in Python
Nehmen Sie Kontakt mit der funktionalen Programmierung in JavaScript oder Python 3 auf
Projekt Euler 37
Projekt Euler 7
Projekt Euler 47
Projekt Euler 31
Projekt Euler 4
Projekt Euler 38
Projekt Euler 17
Projekt Euler 26
Projekt Euler 8
Projekt Euler 23
Projekt Euler 22
Projekt Euler 19
Projekt Euler 50
Projekt Euler 42
Projekt Euler 33
Projekt Euler 32
Projekt Euler 43
Projekt Euler 35
Projekt Euler 36
Projekt Euler 24
Projekt Euler 46
Projekt Euler 48
Projekt Euler 45
Projekt Euler 6
Projekt Euler 44
Erstellen Sie eine Python-Projektdokumentation in Sphinx
Projekt Euler 39
Projekt Euler 40
Projekt Euler 49
Projekt Euler 29
Projekt Euler 27
Projekt Euler 41
Projekt Euler 18
Projekt Euler 11 "Maximales Produkt im Raster"
Projekt Euler 13
Projekt Euler 30