파이썬 학교에서 하는데 이문제는 도저히 어떻게 풀지 모르겠어요 ㅠㅠ

waterpencils50의 이미지

일단 x에 숫자를 넣어서 그 x에 가장 맞는 2의 제곱수를 찾는건데요
예를 들어 x=8이면 2의 3제곱을 리턴값으로 주고

11.5면 2의 제곱중 가장 가까운수가 8이랑 16이 있는데 8이 더 가까워서 8이오고

14면 2의 제곱중 8이랑 16이 있는데 16이 더 가까워서 16이 나오는식인데요

어떤식으로 접근할지 모르겠네요...

def nearest_two(x):
"""Return the power of two that is nearest to x.

>>> nearest_two(8) # 2 * 2 * 2 is 8
8.0
>>> nearest_two(11.5) # 11.5 is closer to 8 than 16
8.0
>>> nearest_two(14) # 14 is closer to 16 than 8
16.0
>>> nearest_two(2015)
2048.0
>>> nearest_two(.1)
0.125
>>> nearest_two(0.75) # Tie between 1/2 and 1
1.0
>>> nearest_two(1.5) # Tie between 1 and 2
2.0

"""
power_of_two = 1.0
"*** YOUR CODE HERE ***"
return power_of_two

yukariko의 이미지

n의 log2 값과 반올림, 거듭제곱을 이용하면
답을 구할 수 있을것 같네요.

pinebud의 이미지

쉬프트 연산을 이용하는 것은 어떨까요?
무식하지만 그냥 << 2 계속 하면서 범위에 들어오면 앞 뒤 두 수중에서 고르는 것으로요..
얼마나 빠를지는 모르게습니다.

A rose is a rose is a rose..

esrevinu의 이미지

x가 1.5 이하이면 2^0,
아니면 2의 거듭제곱을 만들어 가면서 x와 비교해서 x <= 3 * 2^n (n >= 0)인 첫 수가 나오면 2^(n+1)이 답일 것 같습니다.
--
지수가 음수인 것도 포함이군요. 더 생각해 보겠습니다. ㅎㅎ

--
x가 1 이상이면 위와 같이 하고,
1보다 작은 경우는 0.75보다 크면 2^0,
그리고 n을 1씩 빼 가면서 x > 3 * 2^n (n <= -3)인 첫 수가 나오면 2^(n+2)가 답.

정리하면 x가 1 이상이면 y = 1.5 로 두고 y에 2를 곱해 가면서(0번 곱한 것도 포함) x <= y인 첫 수를 찾는데 y에 2를 곱한 횟수를 n이라고 하면 2^n이 답이 되고,
x가 1보다 작으면 y = 0.75로 두고 y를 2로 나눠 가면서(0번 나눈 것도 포함) x > y인 첫 수를 찾는데 y를 2로 나눈 횟수를 n이라고 하면 2^(-n)이 답이 됩니다.

--
예를 보니까 <=는 <로 바꿔야 할 것 같고, >는 >=로 바꿔야 할 것 같네요.

ameba의 이미지

효율적이라고 할 순 없습니다만, 이런게 파이썬냄새나는 코드죠.

def nearest_two(x):
return min( (2**n for n in range(-16,16)), key=lambda p:abs(x-p) )

--

수정.이래야 예제와 맞네요.

def nearest_two(x):
return min( (float(2**n) for n in reversed(range(-16,16))), key=lambda p:abs(x-p) )

waterpencils50의 이미지

지금 확인해보니 답변들 엄청 많이해주셨네요! 공부하는데 많이 제가 수학을 잘못해서인지 이런게 생각이 안되네요 ㅜ 답변들 잘 참고하겠습니다!!!