2013-10-27 4 views
1

Это от упражнений пальцев 3.1 во Введении к вычислениям и программированию с использованием Python.Вложенные петли в Python 2

Написать программу, которая запрашивает пользователя ввести целое число и печатает два целых числа, root и pwr, таким образом, что 0 < pwr < 6 и root**pwr равен целому числу, введенному введенный. Если такой пары целых чисел не существует, она должна напечатать сообщение об этом.

Я получил чертовски близкий, частично благодаря некоторым предложениям в переполнении стека. Но никто не прошел довольно далеко, частично потому, что целью упражнения является использование вложенных циклов While, а не циклов For или чего-либо еще более сложного. Это упражнение является исчерпывающим перечислением.

Я действительно очень близко. Вот то, что я до сих пор:

num = int(raw_input('Enter a positive integer: ')) 
power = 0 
root = 0 
while power < 6: 
    if root ** power == num: 
     break 
    power += 1 
    root= 0 
    while root ** power < num:  
     root += 1 

if root**power == num: 
    print('Root = ' + str(root) + ' and power = ' + str(power)) 
else: 
    print('No pair of integers exist such that one has an exponent that is between 1 and 6') 

Там только две проблемы здесь: я должен выполнить проверку, чтобы увидеть, если корень и мощности равный пользовательский ввод и что чувствует себя ненужным. Интересно, как сделать это чище.

Также, когда пользователь вводит 1 для ввода, программные выходы Root 0 and Power 0, которые находятся за пределами параметров упражнения.

+0

ответ

1

Было интересно, как сделать это чище.

Простой. Вы можете свернуть на одну линии, превращая

while power < 6: 
    if root ** power == num: 
     break 

в

while (power < 6) and (root ** power != num): 

(в круглых скобках не нужны, но я считаю, что это помогает читаемости.)

+0

Почему вы изменили логику с помощью '(root ** power! = Num)' – Leonardo

+1

Нет никакого логического изменения; эти два эквивалентны. «Разрыв, когда' (root ** power == num) 'в начале цикла" совпадает с «продолжать, только если» (root ** power! = num) '. –

+0

Вы правы, это не меняет логики. – Leonardo

0

В настоящее время вы установили:

power = 0 
root = 0 

Если пользователь вводит 1, то 0**0 = 1 так вы нарушите из вашего времени цикла и первое условие печати проходит. Есть несколько способов поймать это, один из способов - добавить дополнительное условие к вашему, если это проверяет, является ли значение num равным 1 перед печатью.

if (root**power == num) and (not num == 1): 
    print('Root = ' + str(root) + ' and power = ' + str(power)) 

Другой способ решения этой проблемы было бы, чтобы обновить начальное значение мощности, чтобы быть 1. В описании проблемы 0<power<6 поэтому нижний предел мощности равен 1, а верхняя является 5.

power = 1 
root = 0 

Чтобы сделать очиститель кода, вы можете включить оператор if в свой цикл while в качестве условия проверки цикла while. Основная причина, по которой вы можете это сделать, - это то, что вы в любом случае должны делать break.

while (power < 6)and not (root**power == num): 
    power+=1 
    while root ** power < num: 
     root+=1 
+0

И действительно, стартовая мощность в 1 - самое приятное решение. – Leonardo

0

Вы должны инвертировать вашу петлю. Вам нужно увеличить корень во внешнем цикле, а затем перебрать мощности во внутреннем цикле. В противном случае вы всегда будете соответствовать «power == 1», потому что root будет увеличен до целевого номера, и все.

Способ, которым у вас это есть, если у вас есть num = 42, мощность будет установлена ​​равной 1, тогда корень будет просто повторен до 42. Если у вас есть сила, увеличенная во внутреннем цикле, тогда вы будете иметь :

root == 1, power == 1, root**power == 1 
root == 1, power == 2, root**power == 1 
root == 1, power == 3, root**power == 1 
root == 1, power == 4, root**power == 1 
root == 1, power == 5, root**power == 1 
root == 2, power == 1, root**power == 2 
root == 2, power == 2, root**power == 4 
root == 2, power == 3, root**power == 16 
root == 2, power == 4, root**power == 64 
root == 3, power == 1, root**power == 3 
root == 3, power == 2, root**power == 9 
... and so forth ... 

Не это ли поведение, которое вы ищите?

0
x = int(raw_input('Enter an integer:')) 
num = 2 
for pwr in range(2,7): 
    while num ** pwr < x: 
     num += 1 
     if num ** pwr == x: 
      False 

    if num ** pwr == x: 
     break 
    num = 2 
if num ** pwr != x: 
    print 'no root' 
else: 
    print num,pwr 
1

Вот мое решение, если кому-то все еще интересно. (с добавлением принтов для каждой итерации)

x = int(raw_input('Enter an integer: ')) 


pwr = 1 
root = 0 
while root**pwr < abs(x)+1: 
    #print "Root ->" , root 
    #print "x - >", x 
    #print "Current root**pwr", root**pwr 
    while pwr < 6: 
     if root**pwr == abs(x): 
       print "Root and Power: " , root, pwr 
     #print " pwr, root**pwr->", pwr, root**pwr 
     pwr = pwr + 1 


    pwr = 1 
    root = root+1 
Смежные вопросы