문제:
선택한 언어에서 부호없는 64 비트 정수의 제곱근의 바닥을 반환하는 가장 짧은 함수를 작성하십시오.
테스트 사례 :
함수는 모든 입력에 대해 올바르게 작동해야하지만 아이디어를 설명하는 데 도움이되는 몇 가지가 있습니다.
INPUT ⟶ OUTPUT
0 ⟶ 0
1 ⟶ 1
2 ⟶ 1
3 ⟶ 1
4 ⟶ 2
8 ⟶ 2
9 ⟶ 3
15 ⟶ 3
16 ⟶ 4
65535 ⟶ 255
65536 ⟶ 256
18446744073709551615 ⟶ 4294967295
규칙 :
- 원하는대로 함수 이름을 지정할 수 있습니다. 이름이 없거나 익명이거나 람다 함수는 어떤 식 으로든 호출 할 수있는 한 괜찮습니다.
- 문자 수는이 문제에서 가장 중요한 요소이지만 런타임도 중요합니다. 매우 작은 문자 수로 O (√n) 시간에 대한 답변을 반복적으로 위쪽으로 스캔 할 수 있다고 확신하지만 O (log (n)) 시간은 실제로 더 좋을 것입니다 (즉, 입력 값 n을 가정하면, n의 비트 길이가 아님).
- 순수한 정수 및 / 또는 부울 artithmetic을 사용하여 함수를 구현하고 싶을 것입니다. 그러나 실제로 부동 소수점 계산을 사용하려면 라이브러리 함수를 호출하지 않는 한 괜찮습니다. 따라서
return (n>0)?(uint32_t)sqrtl(n):-1;
C에서 말하는 것은 올바른 결과를 얻을지라도 한계를 벗어납니다. 당신 부동 소수점 연산을 사용하고, 당신이 사용할 수있는 경우*
,/
,+
,-
, 및 지수 (예,**
또는^
그것은 선택의 여지가 귀하의 언어로 운영자 내장,하지만 만약 힘의 지수는 이하 1 이상 ). 이 제한은 전화sqrt()
또는 변형 을 호출 하거나 값을 ½ 제곱으로 "속임수"를 방지 하는 것입니다. - 부동 소수점 연산을 사용하는 경우 (# 3 참조) 반환 유형이 정수일 필요는 없습니다. 반환 값이 정수 (예 : floor (sqrt (n)))이고 부호없는 32 비트 값을 보유 할 수 있다는 것만 해당합니다.
- C / C ++를 사용하는 경우 부호없는 64 비트 및 32 비트 정수 유형이 있다고 가정 할 수 있습니다 (예 :
uint64_t
및uint32_t
에 정의 됨)stdint.h
. 그렇지 않으면 정수 유형이 부호없는 64 비트 정수를 보유 할 수 있는지 확인하십시오. - 언어가 64 비트 정수를 지원하지 않는 경우 (예 : Brainfuck은 8 비트 정수만 지원함)이를 최대한 활용하여 답변 제목에 제한을 기술하십시오. 즉, 64 비트 정수를 인코딩하고 8 비트 프리미티브 산술을 사용하여 제곱근을 올바르게 얻는 방법을 알아낼 수 있다면 더 많은 힘을 얻을 수 있습니다!
- 즐기고 창의력을 발휘하십시오!
O(log_2 n) === O(log_4 n)
. log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2