Как использовать вложенные циклы for для нахождения x и y линейного уравнения - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь выяснить, сколько 10 и 50 долларовых банкнот уходит в 1760 долларов, если только 160 счетов.Я понял, с помощью друга, что использование вложенного цикла for - лучший способ, но у меня возникли проблемы с реализацией.Моя идея состоит в том, чтобы перебирать каждый x по одному до 160, и если затем уравнение! = 1760, я увеличиваю y на 1 и перезапускаю.

Это уравнения: 10x + 50y = 1760, x + y = 160

Мой желаемый результат: 10(156) + 50(4) = 1760.Но пока все, что я получаю, это:

10(1) + 50(0) = 10
10(2) + 50(1) = 70
10(3) + 50(2) = 130
10(4) + 50(3) = 190
10(5) + 50(4) = 250
...
...
...
10(156) + 50(30) = 3060
10(157) + 50(30) = 3070
10(158) + 50(30) = 3080
10(159) + 50(30) = 3090
10(160) + 50(30) = 3100

И по какой-то причине у меня застряли 30, начиная с х = 31. Я не знаю почему.В любом случае, это мой код:

for i in range(1, 161):
    print("10" + "(" + str(i) + ") + 50" + "(" + str(y) + ")" + " = " + str((10*i)+(50*y)))
    if ((10*i)+(50*y) < 1760):
        y += 1

Я не хочу точного ответа.Я просто хочу знать, где я иду не так.

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Почему ваш y застревает на 30:

Когда сумма превышает 1760, y никогда не увеличивается снова, так как (10*x + 50*y) < 1760 всегда False.Это происходит в x=31 и y=30, поэтому ваш y «застрял» в 30.


Ваш подход почти завершен, но незначительная ошибка влогика :

Вместо запуска 10 счетов, x, до 160 и увеличения 50 счетов, y, на единицу, только если сумма превышает желаемую сумму, вы можетезапустите 10 счетов до 160 и непосредственно установите количество 50 счетов в каждой итерации равным y = 160 - x.Это потому, что вы выполняете это условие (160 = x + y), поэтому необходимо учитывать только те конфигурации, которые удовлетворяют этому требованию.

Итак, вы были правы в том, что вам нужен только один цикл for , но вы можете установить y на каждой итерации непосредственно как 160 = x + y, а затем вам нужно только проверить, правильна ли сумма.

Так что Ansatz для этого решениявыглядит примерно так:

for x in range(0, 161):
    y = 160 - x
    # calculate the sum
    # if the sum is correct, break
0 голосов
/ 31 декабря 2018

Пока не могу комментировать, извините.rb612 правильно объяснил проблему.

замените ваш код после второй строки на

for y in range(1, 160-i):
     if((10*i)+(50*y) <= 1760):
          y += 1
     else: break 
0 голосов
/ 31 декабря 2018

Добро пожаловать в StackOverflow!

Моя идея состоит в том, чтобы повторять каждый x один за другим до 160, и если затем уравнение! = 1760, я увеличиваю y на 1 и перезапускаю.

Проблема в том, что вы не пишете вложенный цикл for.Вложенный цикл for имеет вид:

for(...):
   ...
   for(...):

Вместо этого вы увеличиваете y, даже когда вы проходите через x s в первый раз, поскольку у вас есть оператор if.Он "зависает" из-за 30*10+29*50 = 1750, но как только вы снова запустите цикл, 31*10+30*50 = 1810, который больше 1760, и поэтому оператор if оценивается как false, и y никогда не увеличивается снова.Поэтому вместо этого вы захотите создать два цикла for, вложенных, как я продемонстрировал выше, и после завершения внутреннего цикла вы захотите увеличить y на 1 (что и делает цикл for автоматически).

Редактировать из комментариев:

Ваш код будет выглядеть примерно так:

for y in range(0,161):
   ...
   for x in range(0,161):
      ... #go through and check if the equations are satisfied

Обратите внимание, что приведенное выше эквивалентно:

x = 0
y = 0
while(y <= 160):
   ...
   while(x <= 160):
      ... #go through and check if the equations are satisfied
      x+=1 #add 1 to x
   y+=1 #when the second loop is done iterating, add 1 to y and loop again

Если вы исследуете, что здесь происходит, когда y=0, компьютер увидит внутренний цикл for и начнёт проходить через каждое число для x в диапазоне от 0 до 160, а затем после этой точки, если совпадение не найдено,цикл снова запустится (и поскольку это цикл for, а не цикл while, увеличение y на 1 уже происходит автоматически).

...