Форум сайта python.su
Всем доброго времени суток, начал изучать программирование, решаю ряд учебных задач и столкнулся с проблемой.
Задача:
По данному натуральному числу N найдите наибольшую целую степень двойки, не превосходящую N. Выведите показатель степени и саму степень.
Операцией возведения в степень пользоваться нельзя!
Мое решение:
n = int(input())
i = 0
while 2 ** i <= n:
i += 1
print(i, 2 ** i)
Для примера если n = 50, после выполнения этого кода получаю значения: 6 64, а должно быть 5 32, подскажите где у меня ошибка?
Офлайн
Ошибка на последнем шаге:
2 **5 <= 50 # условие выполняется, i +=1 # поэтому i увеличивается на 1 print(6, 2 **6) # и выводится на печать
Отредактировано old_monty (Май 7, 2016 18:31:38)
Офлайн
Ошибка в том, что вы выводите результат, который выходит за условие 2**i<=n. Выводите n-1)
Офлайн
Всем спасибо!
Офлайн
Вообще, там должно умножение на 2 использоваться или сдвиг на 1.
Офлайн
n = int(input())
k = 0
p = 1
while p < n:
p = p * 2
k += 1
print(k)
Офлайн
antontriespythonПожалуйста, объясните логику программы?
n = int(input())k = 0p = 1while p < n: p = p * 2 k += 1print(k)
Офлайн
При каждом прохождении цикла идёт умножение на 2, что эквивалентно: каждое прохождение цикла - увеличивает степень двойки на 1. Как раз k считает количество прохождения цикла или, другими словами, степень двойки.
Здесь k показывает количество прохождения цикла, которое равно степени двойки, начиная с 2**0 (начальное значение k=0). Попробуй на листочке вручную выполнить несколько прохождений цикла и сравнить результат каждого хода с значением 2**k.
Офлайн