함수는 자연수를 취하고 자신을 포함하여 정확히 그 양의 제수를 가진 가장 작은 자연수를 반환합니다.
예 :
f(1) = 1 [1]
f(2) = 2 [1, 2]
f(3) = 4 [1, 2, 4]
f(4) = 6 [1, 2, 3, 6]
f(5) = 16 [1, 2, 4, 8, 16]
f(6) = 12 [1, 2, 3, 4, 6, 12]
...
이 함수는 제수 목록을 반환 할 필요가 없으며 예제를위한 것입니다.
함수는 자연수를 취하고 자신을 포함하여 정확히 그 양의 제수를 가진 가장 작은 자연수를 반환합니다.
예 :
f(1) = 1 [1]
f(2) = 2 [1, 2]
f(3) = 4 [1, 2, 4]
f(4) = 6 [1, 2, 3, 6]
f(5) = 16 [1, 2, 4, 8, 16]
f(6) = 12 [1, 2, 3, 4, 6, 12]
...
이 함수는 제수 목록을 반환 할 필요가 없으며 예제를위한 것입니다.
답변:
f←{({+/⍵=⍵∧⍳⍵}¨⍳2*⍵)⍳⍵}
f
숫자를 계산하는 데 사용할 수 있는 함수 를 정의합니다 .
> f 13
4096
> f 14
192
이 솔루션은 LCM (n, x) == n iff x가 n을 나누는 사실을 이용합니다 . 따라서 블록은 {+/⍵=⍵∧⍳⍵}
단순히 제수의 수를 계산합니다. 이 함수는 1 에서 2 ^ d 까지의 모든 숫자에 적용됩니다 ¨⍳2*⍵
. 그런 다음 결과 목록 에서 원하는 함수 f (d) 인 d 자체 ( ⍳⍵
) 를 검색합니다 .
{⍵⍳⍨(+/⊢=⊢∧⍳)¨⍳2*⍵}
f
.
{.{\.,{)1$\%},,-=}+2@?,?}:f;
편집 : Peter Taylor 덕분에 검색을 <2 ^ n으로 제한하면 단일 문자를 저장할 수 있습니다 .
이전 버전:
{.{\)..,{)1$\%},,-@=!}+do}:f;
GolfScript에서 온라인으로 실행하십시오 .
예 :
13 f p # => 4096
14 f p # => 192
15 f p # => 144
이 코드에는 기본적으로 세 개의 블록이 포함되어 있으며 다음 줄에 자세히 설명되어 있습니다.
# Calculate numbers of divisors
# .,{)1$\%},,-
# Input stack: n
# After application: D(n)
., # push array [0 .. n-1] to stack
{ # filter array by function
) # take array element and increase by one
1$\% # test division of n ($1) by this value
}, # -> List of numbers x where n is NOT divisible by x+1
, # count these numbers. Stack now is n xd(n)
- # subtracting from n yields the result
# Test if number of divisors D(n) is equal to d
# {\D=}+ , for D see above
# Input stack: n d
# After application: D(n)==d
{
\ # swap stack -> d n
D # calculate D(n) -> d D(n)
= # compare
}+ # consumes d from stack and prepends it to code block
# Search for the first number which D(n) is equal to d
# .T2@?,? , for T see above
# Input stack: d
# After application: f(d)
. # duplicate -> d d
T # push code block (!) for T(n,d) -> d T(n,d)
2@? # swap and calculate 2^d -> T(n,d) 2^d
, # make array -> T(n,d) [0 .. 2^d-1]
? # search first element in array where T(n,d) is true -> f(d)
1
.
파이썬 : 66
f=lambda n,k=1:n==sum(k%i<1for i in range(1,k+1))and k or f(n,k+1)
위의 내용은 RuntimeError: maximum recursion depth exceeded
CPython에서 작은 입력으로 a를 발생시키고 한계를 큰 수로 설정하면 문제가 발생할 수 있습니다. 꼬리 재귀를 최적화하는 파이썬 구현에서는 정상적으로 작동합니다.
이러한 제한이 없어야하는보다 자세한 버전은 다음 79 바이트 솔루션입니다.
def f(n,k=1):
while 1:
if sum(k%i<1for i in range(1,k+1))==n:return k
k+=1
if else
과 함께 and or
및 다음 ==1
을 사용하여 일부 문자를 저장할 수 있습니다 <1
.f=lambda n,k=1:n==sum(k%i<1for i in range(1,k+1))and k or f(n,k+1)
sum(k%-~i<1for i in range(k))
f=lambda n,k=1:n==sum(k%-~i<1for i in range(k))or-~f(n,k+1)
7 바이트를 절약합니다.
(For[i=1,DivisorSum[++i,1&]!=#,];i)&
용법:
(For[i=1,DivisorSum[++i,1&]!=#,];i)&@200
결과:
498960
편집하다
몇 가지 설명 :
DivisorSum [n, form]은 n을 나누는 모든 i에 대한 form [i]의 합을 나타냅니다.
마찬가지로 form[i]
나는 기능을 사용하고 1 &
반환 항상 것을, 1
그래서 효과적으로 간결한 방식의 약수의 합을 계산.
DivisorSum
수익 (제수의 합)을 알고 있다고 생각 했지만 그것이 질문에 대답하는 데 어떻게 도움이되는지는 알지 못합니다. 작동 방식을 설명해 주시겠습니까? BTW, n = 200에 대한 타이밍 데이터를 포함해야한다고 생각합니다. 확인해야 할 모든 숫자가 주어지면 기능이 매우 빠릅니다.
빠르고 더러운 (읽기 쉽고 까다로운) 솔루션 :
f k=head[x|x<-[k..],length[y|y<-[1..x],mod x y==0]==k]
{⍵{⍺=+/0=⍵|⍨⍳⍵:⍵⋄⍺∇⍵+1}1}
자바 스크립트 70
function f(N){for(j=i=m=1;m-N||j-i;j>i?i+=m=j=1:m+=!(i%++j));return i}
실제로 46 개의 의미있는 캐릭터 만 있습니다 :
for(j=i=m=1;m-N||j-i;j>i?i+=m=j=1:m+=!(i%++j))
문법이 짧은 언어를 배워야 할 것입니다 :)
N=>eval("for(j=i=m=1;m-N||j-i;j>i?i+=m=j=1:m+=!(i%++j));i")
초기 Haskell 솔루션의 개선으로 볼 수 있지만 자체적으로 생각했습니다 (경고 : 매우 느립니다).
f n=until(\i->n==sum[1|j<-[1..i],rem i j<1])(+1)1
예를 들어 f (p) = 2 ^ (p-1)입니다. 여기서 p는 소수입니다.
n
소수 (소수점)를 반복하고, 내림차순으로 정렬하고, 각각을 감소시키고, 소수의 소수로 압축 한 다음 곱을 계산하는 것입니다.p^(factor-1)
1<>p=[]
x<>p|mod x p>0=x<>(p+1)|1<2=(div x p<>p)++[p]
f k=product[p^(c-1)|(p,c)<-zip[r|r<-[2..k],2>length(r<>2)](k<>2)]
테스트 코드 :
main=do putStrLn$show$ f (100000::Integer)
이 방법은 매우 빠릅니다. 아이디어는 먼저 k=p1*p2*...*pm
p1 <= p2 <= ... <= pm 의 주요 요소를 찾는 것 입니다. 그럼 대답은n = 2^(pm-1) * 3^(p(m-1)-1) * 5^(p(m-2)-1) ...
입니다.
예를 들어 k = 18을 인수 분해하면 18 = 2 * 3 * 3이됩니다. 처음 3 개의 소수는 2, 3, 5입니다. 따라서 답 n = 2 ^ (3-1) * 3 ^ (3-1) * 5 ^ (2-1) = 4 * 9 * 5 = 180
아래에서 테스트 할 수 있습니다 ghci
.
*Main> f 18
180
*Main> f 10000000
1740652905587144828469399739530000
*Main> f 1000000000
1302303070391975081724526582139502123033432810000
*Main> f 100000000000
25958180173643524088357042948368704203923121762667635047013610000
*Main> f 10000000000000
6558313786906640112489895663139340360110815128467528032775795115280724604138270000
*Main> f 1000000000000000
7348810968806203597063900192838925279090695601493714327649576583670128003853133061160889908724790000
*Main> f 100000000000000000
71188706857499485011467278407770542735616855123676504522039680180114830719677927305683781590828722891087523475746870000
*Main> f 10000000000000000000
2798178979166951451842528148175504903754628434958803670791683781551387366333345375422961774196997331643554372758635346791935929536819490000
*Main> f 10000000000000000000000
6628041919424064609742258499702994184911680129293140595567200404379028498804621325505764043845346230598649786731543414049417584746693323667614171464476224652223383190000
fl
출력 변수를 통해 입력을 받고 입력 변수를 통해 출력합니다.
f The list of factors of
the input variable
l has length equal to
the output variable.
입력 변수를 통해 입력하고 출력 변수를 통해 출력하는이 동일한 술어 는 대신이 문제를 해결합니다 .
(For[k=1,DivisorSigma[0, k]!= #,k++]; k)&
용법
(For[k = 1, DivisorSigma[0, k] != #, k++]; k) &[7]
(* 64 *)
첫 번째 항목 ( code-golf
태그가 질문에 추가 되기 전 )
직접적인 문제는, 그 주어진 Divisors[n]
반환에게의 제수 n
(포함 n
) 및 Length[Divisors[n]]
반환 등의 약수의 개수를. **
smallestNumber[nDivisors_] :=
Module[{k = 1},
While[Length[Divisors[k]] != nDivisors, k++];k]
예
Table[{i, nDivisors[i]}, {i, 1, 20}] // Grid
Length@Divisors@n
이다 DivisorSigma[0,n]
.
DivisorSigma
.
2*RÆdi
온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인 .
2*RÆdi Main link. Argument: n (integer)
2* Compute 2**n.
R Range; yield [1, ..., 2**n]. Note that 2**(n-1) has n divisors, so this
range contains the number we are searching for.
Æd Divisor count; compute the number of divisors of each integer in the range.
i Index; return the first (1-based) index of n.
2*
? 그 이후의 모든 숫자가 n보다 더 많은 제수를 가지고 있습니까?
2**(n-1)
{my \a=$=0;a++while $_-[+] a X%%1..a;a}
사용법 예 :
say (0..10).map: {my \a=$=0;a++while $_-[+] a X%%1..a;a}
(0 1 2 4 6 16 12 64 24 36 48)