Форум » Циклы и ветвления » Задача №439 (задание 21). » Ответить

Задача №439 (задание 21).

zaport: Непонятно, почему получается 13 в ответе к программе (Python). Определите, количество чисел k, для которых следующая программа выведет такой же результат, что и для k = 10? def f(n): return n * n * n k = int(input()) i = 1 while f(i) < k: i += 1 if f(i)-k <= k-f(i-1): print(i) else: print(i-1) Начинаем разбираться для k=10. Для начала, цикл while сработает последний раз для i=2, т.е. всего 2 раза. Т.к. n^3 < 10: 1^3 = 1 < 10; 2^3 = 8 < 10; 3^3 = 27 > 10. Итого потенциально у нас в k могут быть значения от 9 до 27 9 <= k <= 27 (1 ограничение). Проверяем условие. Преобразуем к виду i^3 + (i-1)^3 <= 2*k Первая итерация 8 + 1 = 9 <= 20 (да) печатаем 2 Вторая итерация 27 + 8 = 35 <= 20 (нет) печатаем 2 Получается, что 9 <= 2*k < 35, следовательно, 5 <= k (целое) <= 17 Итого, 5 <= k <= 17 (2 ограничение). Находим пересечение (т.к. должны соблюдаться оба ограничения, иначе либо будет другое количество итераций и выведется другое количество чисео, либо будут выведены другие числа) первого ограничения и второго (в целых числах). 9 <= k <= 17 Итого остаются значения 9, 10, 11, 12, 13, 14, 15, 16, 17 Ответ: 9 значений.

Ответов - 11

Поляков: zaport пишет: Для начала, цикл while сработает последний раз для i=2, т.е. всего 2 раза. Верно. Итого потенциально у нас в k могут быть значения от 9 до 27. Вы забыли, что в некоторых случаях на кран выводится i, а в некоторых - i-1. Поэтому нужно определить, что выводится при k=10 и проверить оба случая.

zaport: Поляков пишет: Поэтому нужно определить, что выводится при k=10 и проверить оба случая. Константин Юрьевич, это еще не ответ. Дочитайте до конца, пожалуйста. Там все есть :-)

Поляков: zaport пишет: Константин Юрьевич, это еще не ответ. Дочитайте до конца, пожалуйста. Там все есть :-) Я дочитал до конца, но плохо понимаю ваше объяснение. Но факт, что вы получаете неверный ответ. Проверьте ради интереса k = 5, там тоже будет 2 на выходе. Находим пересечение Этого я вообще не понял.


zaport: Поляков пишет: Проверьте ради интереса k = 5, там тоже будет 2 на выходе. В том-то и дело, что будет одна 2 на выходе. Мы же во вторую итерацию не заходим в таком случае. Когда при k = 10 на экран выводится две двойки.

Поляков: zaport пишет: В том-то и дело, что будет одна 2 на выходе. Мы же во вторую итерацию не заходим в таком случае. Когда при k = 10 на экран выводится две двойки. Ах, вот оно что... :-) А набрать программу и проверить? Выводится одно число, потому что срабатывает либо if, либо else.

zaport: Поляков пишет: А набрать программу и проверить? Так именно так и сделал :-) В каждой итерации срабатывает if-else. При k = 10 две итерации и на выходе 2 числа, при k = 5 одна итерация и одно число.

Поляков: zaport пишет: В каждой итерации срабатывает if-else. Понял. Hint: if не в цикле. Уберите отступ.

zaport: Все, понял ошибку. Неправильно расставил операторные скобки :-) Спасибо за терпение :-)

zaport: Но все же с if в цикле задача становится интереснее :-)

Поляков: zaport пишет: Но все же с if в цикле задача становится интереснее :-) Да. Кстати, полезно, что вы ее порешали. Думаю, что понимания прибавилось. :-)

zaport: Внимательности скорее) А-то детям объясняю, а сам не вижу очевидного :-)



полная версия страницы