Я не уверен, что каждое число можно представить как (2**m) *r
, учитывая, что m и r являются целыми числами, поскольку 15 состоит из 3,5
, и ни один из этих факторов не является степенью 2. [Править Я предполагал, что 2 - это степень 1+, но если бы она могла быть степенью нуля, то это было бы правильно]
Но следуя и предполагая, что ваши входные данные являются числами, которые, несомненно, могут быть представлены как (2**m) *r
, вам нужно чтобы исправить некоторые вещи в вашем l oop, чтобы заставить его работать, решение, которому вы пытаетесь следовать, - это грубая сила, но не полная, вам нужно попробовать каждое значение m с каждым значением r, которое не произойдет в вашем l oop, так что вы можете пропустить решение и go в бесконечное l oop в большинстве случаев.
Более изощренным решением было бы сначала скомпоновать входное число, чтобы получить, сколько 2s у него на самом деле есть
import math
g = 5
m = 0
r = 1
while True:
if(g % r == 0 and math.log2(g/r).is_integer()):
m = math.log2(g/r)
break
r += 2
print(m)
print(r)
пример здесь давайте возьмем 12 делим 12 на 2 вы получите 6 это все еще делит два, поэтому мы продолжаем, 6/2 дает 3 3 не делит 2, поэтому мы заканчиваем l oop и у нас есть г = 3 и m = 2 12 = 2**2 * 3
, что правильно.
и вот ваше решение исправлено
g = 3
m = 0
r = 1
while g != (2**m) * r:
if g < (2**m) * r:
m = -1
r += 2
m += 1
print(m)
print(r)