주변 숫자의 가장 큰 주요 요인


13

이 과제를 순차적으로 설명하는 것이 가장 쉬운 방법이라고 생각합니다. 입력 번호 N으로 시작하고 다음을 수행하십시오 .

  1. 최고의 주요 요소를 찾으십시오
  2. N 위와 아래의 숫자를 확인 하고 최고 소인수가 더 높은지 확인하십시오 (즉, 최고 소인수 N-1 및 / 또는 N + 1N 의 계수보다 높은지 확인하십시오) .
  3. 가장 높은 요소가 증가하는 방향 ( (N-2, N-3 ...) 및 / 또는 (N + 2, N + 3 ...) 등에서 N 에 인접한 더 높은 숫자 및 / 또는 더 낮은 숫자를 계속 확인하십시오 . 의 위에)
  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

에 대한 가장 높은 소인수 1022IS 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 의 가장 큰 주요 요소 를 얻는다고 합시다 . 그런 다음 5N-1과 61N + 1 을 얻 습니다 . 그런 다음 19N-2와 67N + 2를 얻 습니다 . 우리는 이후, 숫자 낮은 계속 시도해야 19>5하기 때문에, 또는 정지 5<61? 즉, 최대는 한쪽에 유지됩니까? (이 예제가 수학적으로 가능한지 확실하지 않습니다.)
PurkkaKoodari

@ Pietu1998, 이제 질문이 더 분명합니까?
Stewie Griffin

N=2실제로 1소인수가 없기 때문에 우위에있는 것처럼 보이므로 계속해야하는지 여부를 결정하기 위해 비교할 수있는 최대 소인수가 없습니다.
Jonathan Allan

답변:


4

매스 매 티카, 82 74 바이트

8 바이트를 절약 한 Martin Ender에게 감사합니다!

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

펄, 137 바이트

위한 코드 + 15 바이트의 122 바이트 -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)에 적용
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.