Повторно отметьте 2 разных числа, чтобы они совпадали с другим числом в python - PullRequest
0 голосов
/ 18 марта 2020

Если вы импортируете число (g), большее или равное 0, тогда вы сможете записать его как: g = (2 ^ m) * r, (m> 0 и r должно быть нечетным). Я пробовал разные вещи и искал в Интернете, но мог найти ответ. Это вопрос, связанный с циклами while / for, потому что он связан с этой главой в моих исследованиях.

Это одна из тех вещей, которые я пробовал до сих пор:

g = int(input(' '))
m = 0
r = 1
while m >= 0:
        m += 1 
        if g == (2**m)*r:
                break
        else:
                r+=2
print(m)
print(r)

Но я всегда прихожу бесконечные петли ...

Если кто-нибудь может мне помочь, я был бы благодарен

1 Ответ

1 голос
/ 18 марта 2020

Я не уверен, что каждое число можно представить как (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)
...