Myślę, że najłatwiej jest wyjaśnić to wyzwanie w sposób sekwencyjny. Zacznij od liczby N i:
- Znajdź swój najwyższy czynnik główny
- Sprawdzić numery powyżej i poniżej N i sprawdzić, czy najwyższy współczynnik prime jest wyższa (czyli najwyższy prime czynnikiem N-1 i / lub N + 1 jest wyższy niż współczynnik N .
- Kontynuuj sprawdzanie wyższych i / lub niższych liczb sąsiadujących z N w kierunkach, w których rosną najwyższe czynniki ( (N-2, N-3 ...) i / lub (N + 2, N + 3 ...) i tak dalej na)
- Gdy nie będzie już żadnych czynników pierwszych w żadnym kierunku, które byłyby wyższe niż te, które już odkryliśmy, zatrzymujemy się i wysyłamy najwyższy czynnik główny, jaki napotkaliśmy.
Spójrzmy na przykład:
245
ma czynniki pierwsze 5, 7, 7
. Sąsiedzi to:
244 -> 2, 2, 61
245 -> 5, 7, 7
246 -> 2, 3, 41
Najwyższy czynnik pierwszy rośnie w obu kierunkach, więc musimy spojrzeć na następnego sąsiada:
243 -> 3, 3, 3, 3, 3
244 -> 2, 2, 2, 61
245 -> 5, 7, 7
246 -> 2, 3, 41
247 -> 13, 19
Najwyższe czynniki pierwsze maleją teraz w obu kierunkach, więc najwyższy czynnik pierwszy, jaki napotkaliśmy, jest 61
i dlatego powinien zostać zwrócony.
Inny przykład:
Spójrzmy na 1024
. Jego główne czynniki to 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
. Głównymi czynnikami jego najbliższych sąsiadów są:
1023 -> 3, 11, 31
1024 -> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
1025 -> 5, 5, 41
Najwyższy współczynnik pierwszy rośnie w obu kierunkach, od 2
do 31
lub 41
. Spójrzmy na sąsiadów:
1022 -> 2, 7, 73
1023 -> 3, 11, 31
1024 -> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
1025 -> 5, 5, 41
1026 -> 2, 3, 3, 19
Najwyższy czynnik pierwszy dla 1022
to 73
, a najwyższy czynnik pierwszy dla 1026
to 19
. Ponieważ 19
jest niższy niż 41
nie jesteśmy nim zainteresowani. Wciąż rośnie dla liczb mniejszych niż N, więc sprawdzimy następny w tym kierunku :
1021 -> 1021
1022 -> 2, 7, 73
1023 -> 3, 11, 31
1024 -> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
1025 -> 5, 5, 41
1026 -> 2, 3, 3, 19
1021
jest liczbą pierwszą i najwyższą liczbą, jaką napotkaliśmy, więc należy ją zwrócić.
Zasady:
- Otrzymasz tylko dodatnie wartości
N
większe1
i mniejsze niż2^31-2
. - Formaty wejściowe i wyjściowe są opcjonalne, ale liczby muszą być w bazie 10.
- Powinieneś kontynuować wyszukiwanie wyższych liczb pierwszych, dopóki najwyższa wartość rośnie w tym kierunku. Kierunki są od siebie niezależne.
Przypadki testowe:
Format: N, highest_factor
2, 3
3, 3
6, 7
8, 11
24, 23
1000, 997
736709, 5417
8469038, 9431
2
dla N. Następnie otrzymujemy5
dla N-1 i61
dla N + 1. Następnie dostajemy19
za N-2 i67
za N + 2. Czy powinniśmy nadal próbować niższych liczb odtąd,19>5
czy przestać od tego czasu5<61
? Czyli maksima są zachowywane na stronę? (Nie jestem pewien, czy przykład jest matematycznie możliwy).N=2
wydaje się, że jest to przypadek skrajny, ponieważ1
nie ma czynników pierwotnych, więc nie ma maksymalnego czynnika pierwotnego, z którym moglibyśmy porównać, aby zdecydować, czy powinniśmy kontynuować.Odpowiedzi:
Mathematica,
8274 bajtyDzięki Martin Ender za oszczędność 8 bajtów!
Nienazwana funkcja pobierająca liczbę całkowitą i zwracająca liczbę całkowitą.
±n_:=#//.x_/;l[t=x+n]>l@x:>t
definiuje funkcję jednoargumentową,±
która zwiększa wejściową liczbę całkowitą funkcji globalnejn
tak długo, jak długo rośnie największy czynnik pierwszy. (Funkcja największego czynnika pierwszego jest zdefiniowana za pomocąl=FactorInteger[#][[-1,1]]&
.){±-1,±1}
Dlatego stosuje tę funkcję dwukrotnie do wejściowej liczby całkowitej, z przyrostem-1
i ponownie z przyrostem1
. NastępnieMax@@(...l...)/@...
bierze większy z dwóch znalezionych w ten sposób największych czynników pierwszych.Poprzednie zgłoszenie:
źródło
@@@
(i możnal@x
tam użyć ):Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&
Perl, 137 bajtów
122 bajty kodu + 15 bajtów dla
-p
i-Mntheory=:all
.Aby uruchomić:
Jeśli nie masz
ntheory
zainstalowanego, możesz go zainstalować, wpisując(echo y;echo) | perl -MCPAN -e 'install ntheory'
terminal.źródło
Ruby, 99 bajtów
Wyjaśnienie:
źródło