Проанализируйте программный код задания (рис. 1). Проверьте вручную, задав переменным следующие значения: а=7, b=20,c=9 и a= 13,b=11,c=0. Запишите результат выполнения каждой из команд в программе при вводе этих значений. Анализируя полученные результаты, выясните, какой алгоритм программно решить данную задачу.
2. Данную задачу решить линейный алгоритм (с ветвлениями if). Мы подставляли текущие значения переменных, тем самым определяли, выполнится командный блок if или нет. Если выполняется - также подставляли значения переменных, и находили новые значения. Мы выполняли код последовательно и были в роли программы, которая считывает написанный код и также выполняет эти же действия.
Объяснение:
Код с объяснениями:
a, b, c = map(int, input().split()) # вводятся значения a, b, c с клавиатуры, через пробел
t = k = h = p = s = 0 # регистрируются переменные, равные нулю
if (a + b + c) % 3 == 0: # если сумма a, b, c кратна трём, то...
k = (a + b + c) // 3 # ...присвоить переменной k значение: целая часть от деления (a + b + c) на 3
t = a - k; p = b - k; h = c - k # ...выполнить данные действия
if t > 0: # если t больше нуля...
s = s + t #...то переменную s увеличить на t
if p > 0: # если p больше нуля...
s = s + p # ...то переменную s увеличить на p
if h > 0: # если h больше нуля...
s = s + h # ...то переменную s увеличить на h
print(s) # вывести значение переменной s
else: # если сумма a, b, c НЕ кратна трём, то...
print(-1) # ...вывести -1
Код с промежуточными результатами при a = 7, b = 20, c = 9:
a, b, c = 7, 20, 9
t = k = h = p = s = 0
if (a + b + c) % 3 == 0: # true. (7 + 20 + 9) % 3 = 36 % 3 = 0 (цел.часть 12)
k = (a + b + c) // 3 # k = 36 // 3 = 12
t = a - k; p = b - k; h = c - k # t = 7 - 12 = -5; p = 20 - 12 = 8; h = 9 - 12 = -3
if t > 0: # false
s = s + t
if p > 0: # true. s = 0 + 8 = 8
s = s + p
if h > 0: # false
s = s + h
print(s) # вывод: 8
else: # не выполнится
print(-1)
Код с промежуточными результатами при a = 13, b = 11, c = 0:
a, b, c = 13, 11, 0
t = k = h = p = s = 0
if (a + b + c) % 3 == 0: # true. (13 + 11 + 0) % 3 = 24 % 3 = 0 (цел.часть 8)
k = (a + b + c) // 3 # k = 24 // 3 = 8
t = a - k; p = b - k; h = c - k # t = 13 - 8 = 5; p = 11 - 8 = 3; h = 0 - 8 = -8
# Код на ruby 2.2.3p173 def zadanie(jump1, jump2) min = jump1 for i in 1..1000 next if (i*jump1)%jump2 == 0 or (i*jump2)%jump1 == 0
if min > (i*jump1)%jump2 min = (i*jump1)%jump2 p [min, "#{i} * #{jump1} - #{i*jump1/jump2} * #{jump2}"] end
if min > (i*jump2)%jump1 min = (i*jump2)%jump1 p [min, "#{i} * #{jump2} - #{i*jump2/jump1} * #{jump1}"] end end return min end # # Примеры применения p zadanie(33, 55)
1) ну первое самое простое: можно получить 16, 28, 44 2) далее можно 12, налить в 28 перелить в 16, из 16л вылить в раковину останется 28 - 16 = 12 3) 32 л, набрать 16, перелить в 28л 16 л, снова набрать 16 л. итого 16 + 16 = 32 4) далее 4л, набрать 16, перелить в 28, набрать в 16л, долить в 28л, в 16л останется 4л, а из 28л вылить в раковину 5) 40л, набрал в 28л, перелил в 16л, вылил из 16л, остаток 12л, перелил в 16л, набрал 28л, итого 12 + 28 = 40 6) 24л, тоже что и в пятом, только с продолжением, набрал в 28л, перелил в 16л, в 28л осталось 12л, из 16 вылил, перелил остаток 12 л в 16 - ю, набрал в 28 л, долил в 16 - ю 4 л, и вылил из 16л все. В 28л осталось 24л. наверное так..
1. Результаты выполнения каждой команды ниже.
2. Данную задачу решить линейный алгоритм (с ветвлениями if). Мы подставляли текущие значения переменных, тем самым определяли, выполнится командный блок if или нет. Если выполняется - также подставляли значения переменных, и находили новые значения. Мы выполняли код последовательно и были в роли программы, которая считывает написанный код и также выполняет эти же действия.
Объяснение:
Код с объяснениями:
a, b, c = map(int, input().split()) # вводятся значения a, b, c с клавиатуры, через пробел
t = k = h = p = s = 0 # регистрируются переменные, равные нулю
if (a + b + c) % 3 == 0: # если сумма a, b, c кратна трём, то...
k = (a + b + c) // 3 # ...присвоить переменной k значение: целая часть от деления (a + b + c) на 3
t = a - k; p = b - k; h = c - k # ...выполнить данные действия
if t > 0: # если t больше нуля...
s = s + t #...то переменную s увеличить на t
if p > 0: # если p больше нуля...
s = s + p # ...то переменную s увеличить на p
if h > 0: # если h больше нуля...
s = s + h # ...то переменную s увеличить на h
print(s) # вывести значение переменной s
else: # если сумма a, b, c НЕ кратна трём, то...
print(-1) # ...вывести -1
Код с промежуточными результатами при a = 7, b = 20, c = 9:
a, b, c = 7, 20, 9
t = k = h = p = s = 0
if (a + b + c) % 3 == 0: # true. (7 + 20 + 9) % 3 = 36 % 3 = 0 (цел.часть 12)
k = (a + b + c) // 3 # k = 36 // 3 = 12
t = a - k; p = b - k; h = c - k # t = 7 - 12 = -5; p = 20 - 12 = 8; h = 9 - 12 = -3
if t > 0: # false
s = s + t
if p > 0: # true. s = 0 + 8 = 8
s = s + p
if h > 0: # false
s = s + h
print(s) # вывод: 8
else: # не выполнится
print(-1)
Код с промежуточными результатами при a = 13, b = 11, c = 0:
a, b, c = 13, 11, 0
t = k = h = p = s = 0
if (a + b + c) % 3 == 0: # true. (13 + 11 + 0) % 3 = 24 % 3 = 0 (цел.часть 8)
k = (a + b + c) // 3 # k = 24 // 3 = 8
t = a - k; p = b - k; h = c - k # t = 13 - 8 = 5; p = 11 - 8 = 3; h = 0 - 8 = -8
if t > 0: # true. s = 0 + 5 = 5
s = s + t
if p > 0: # true. s = 5 + 3 = 8
s = s + p
if h > 0: # false
s = s + h
print(s) # вывод: 8
else: # не выполнится
print(-1)