Найвищий простий коефіцієнт сусідніх чисел


13

Я думаю, що найпростіше пояснити цей виклик послідовно. Почніть з вхідного номера N і:

  1. Знайдіть його найвищий простий коефіцієнт
  2. Перевірка номера вище і нижче N і подивитися , якщо найвищий головним фактором вище (тобто найвищий первинний фактор N-1 і / або N + 1 , вище , ніж фактор N .
  3. Продовжуйте перевіряти більш високі та / або менші числа сусідніх N у напрямках, де збільшуються найвищі коефіцієнти ( (N-2, N-3 ...) та / або (N + 2, N + 3 ...) тощо на)
  4. Після того, як немає жодних простих факторів в будь-якому напрямку, які вищі, ніж ті, які ми вже знайшли, ми зупиняємось і виводимо найвищий простий коефіцієнт, який ми стикалися.

Розглянемо приклад:

245має основні фактори 5, 7, 7. Його сусідами є:

244 -> 2,  2,  61
245 -> 5,  7,  7
246 -> 2,  3,  41

Найвищий основний фактор зростає в обох напрямках, тому ми повинні дивитись на наступного сусіда:

243 -> 3,   3,  3,  3,  3
244 -> 2,   2,  2,  61
245 -> 5,   7,  7
246 -> 2,   3,  41
247 -> 13,  19

Зараз найвищі основні фактори зменшуються в обох напрямках, тому найвищий основний фактор, з яким ми стикалися, є 61, і тому його слід повернути.

Ще один приклад:

Давайте розберемося 1024. Основними її чинниками є 2, 2, 2, 2, 2, 2, 2, 2, 2, 2. Основними факторами найближчих сусідів є:

1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41

Найвищий простий коефіцієнт зростає в обох напрямках, від або 2до . Давайте подивимось на сусідів:3141

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

Найвищий простий коефіцієнт для 1022є 73, а найвищий основний коефіцієнт для 1026- 19. Оскільки 19вона нижча, ніж 41нас це не цікавить. Він все ще збільшується для чисел, менших ніж N, тому ми перевіримо наступне в цьому напрямку :

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 є прем'єр-міністром і найвищим розмахом, з яким ми стикалися, тому його слід повернути.

Правила:

  • Ви отримаєте лише позитив, Nбільший за 1і менший 2^31-2.
  • Формати введення та виведення необов’язкові, але цифри повинні бути в базі 10.
  • Вам слід продовжувати пошук вищих праймерів до тих пір, поки найвище значення зростатиме в цьому напрямку. Напрямки не залежать один від одного.

Тестові приклади:

Формат: N, highest_factor

2, 3
3, 3
6, 7
8, 11
24, 23 
1000, 997
736709, 5417 
8469038, 9431

Скажімо, ми отримуємо найвищий простий коефіцієнт 2для N. Потім отримуємо 5для N-1 і 61для N + 1. Тоді отримуємо 19для N-2 і 67для N + 2. Чи слід продовжувати намагатися знижувати цифри, з тих пір 19>5чи припинити, з тих пір 5<61? Тобто максимуми зберігаються на стороні? (Я не впевнений, чи можливий приклад математично.)
PurkkaKoodari

@ Pietu1998, питання зараз зрозуміліше?
Стюі Гріффін

N=2насправді, здається, кращий випадок, оскільки 1не має первинних факторів, тому немає максимального основного фактора, з яким ми можемо порівняти, щоб вирішити, чи варто продовжувати.
Джонатан Аллан

Відповіді:


4

Математика, 82 74 байт

Дякуємо Мартіну Ендеру за збереження 8 байт!

Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&

Безіменна функція, що приймає цілий вхід і повертає ціле число.

±n_:=#//.x_/;l[t=x+n]>l@x:>tвизначає одинарну функцію, ±яка продовжує збільшувати цілий вхід глобальної функції до nтих пір, поки збільшується найбільший основний коефіцієнт. (Функція найбільшого основного фактора визначена за допомогою l=FactorInteger[#][[-1,1]]&.) {±-1,±1}Тому застосовує цю функцію двічі до вхідного цілого числа, з приростом -1і знову з збільшенням 1. Тоді Max@@(...l...)/@...береться більший з двох знайдених таким чином найбільших факторів.

Попереднє подання:

Max@@(l=FactorInteger[#][[-1,1]]&)/@(#//.x_/;l[t=x+#2]>l[x]:>t&@@@{{#,-1},{#,1}})&

Збережено кілька байтів, уникаючи @@@(і ви можете використовувати l@xтам):Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&
Мартін Ендер

1

Perl, 137 байт

122 байти коду + 15 байт для -pі -Mntheory=:all.

sub f{$t=(factor$_+pop)[-1]}$i=$j=1;while($i|$j){f++$c;($i&=$t>$h)&&($h=$t);f-$c;($j&=$t>$l)&&($l=$t)}$_=$h>$l?$h:$l?$l:$_

Щоб запустити його:

perl -pMntheory=:all -e 'sub f{$t=(factor$_+pop)[-1]}$i=$j=1;while($i|$j){f++$c;($i&=$t>$h)&&($h=$t);f-$c;($j&=$t>$l)&&($l=$t)}$_=$h>$l?$h:$l?$l:$_' <<< 736709

Якщо ви не ntheoryвстановили, ви можете встановити його, ввівши (echo y;echo) | perl -MCPAN -e 'install ntheory'свій термінал.


0

Рубін, 99 байт

->n{f=->n{i=2;n%i<1?n/=i:i+=1while i<n;n};g=->s,z{s+=z while f[s+z]>b=f[s];b};[g[n,1],g[n,-1]].max}

Пояснення:

  • f () - найвищий простий коефіцієнт
  • g () - це функція пошуку сусідів в одному напрямку
  • застосувати g до (n, -1) та до (n, + 1) для пошуку в обох напрямках
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.