Найти в Дзене
Be Happy

Решение задач по программированию на Python (часть 5, while)

Представляю вашему вниманию решение нескольких тренировочных задач по программированию, взятых из курса обучения "Основы программирования на Python" (автор курса: National Research University Higher School of Economics, 2 неделя обучения), размещенному на сайте coursera.org. Привожу решения пяти задач для отработки навыков использования оператора WHILE. Задачи нужно решить без использования всего богатого арсенала языка Python, используя только If и While. Перечень задач: Обращение числа, Количество палиндромов, Максимальное число подряд идущих равных, Максимальная длина монотонного фрагмента и Наименьшее расстояние между локальными максимумами. Обращение числа. "Переставьте цифры числа в обратном порядке ." (описание взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/JAMsA/obrashchieniie-chisla) Решение n = int(input())
if n < 10:
....print(n)
else:
....s = ''
....i = 0
....k = 10
....while n >= k:
........i += 1
........k = k * 10
....while i > 0 and n >
Оглавление
изображение с сайта opencollective.com
изображение с сайта opencollective.com

Представляю вашему вниманию решение нескольких тренировочных задач по программированию, взятых из курса обучения "Основы программирования на Python" (автор курса: National Research University Higher School of Economics, 2 неделя обучения), размещенному на сайте coursera.org.

Привожу решения пяти задач для отработки навыков использования оператора WHILE. Задачи нужно решить без использования всего богатого арсенала языка Python, используя только If и While.

Перечень задач: Обращение числа, Количество палиндромов, Максимальное число подряд идущих равных, Максимальная длина монотонного фрагмента и Наименьшее расстояние между локальными максимумами.

Обращение числа.

"Переставьте цифры числа в обратном порядке ."

(описание взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/JAMsA/obrashchieniie-chisla)

Решение

n = int(input())
if n < 10:
....print(n)
else:
....s =
''
....i = 0
....k = 10
....while n >= k:
........i += 1
........k = k * 10
....while i > 0 and n > 9:
........s = s + str(n % 10)
........n = n // 10
........i -= 1
....print(s + str(n))

Если бы можно было использовать операции с массивами, то все было бы гораздо проще, а так приходится пользоваться остатком от деления на 10, 100 и т.д. и переносить его вперед.

Количество палиндромов.

"Если число не меняется при перестановке его цифр в обратном порядке, то это число называется палиндромом. Создайте программу, которая по числу K выводит количество натуральных палиндромов, не превосходящих K (1≤K≤100000)."

(описание взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/0YL1I/kolichiestvo-palindromov)

Решение

n = int(input())
if n < 10:
....print(n)
elif n == 10:
....print(9)
else:
....q = 0
....ii = 11
....while ii <= n:
........s =
''
........i = 0
........k = 10
........nn = ii
........while nn >= k:
............i += 1
............k = k * 10
........while i > 0 and nn > 9:
............s = s + str(nn % 10)
............nn = nn // 10
............i -= 1
........s = int(s + str(nn))
........if s == ii:
............q += 1
........ii += 1
....print(q + 9)

В решении этой задачи использован код из предыдущей. Если число больше 10, то в цикле перебираются последовательно все числа от 11 до К, обращаются и сравниваются. Таким образом подсчитывается количество палиндромов.

Максимальное число подряд идущих равных.

"Задана последовательность натуральных чисел. При вводе нуля она завершается. Определите, какое максимальное число подряд идущих элементов этой последовательности равны друг другу."

(описание взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/6I71w/maksimal-noie-chislo-podriad-idushchikh-ravnykh)

Решение

n = int(input())
maxInRow = 0
max = 0
if n != 0:
....max = 1
....last = n
while n != 0:
....n = int(input())
....if n != 0 and n == last:
........max += 1
....elif n != 0 and n != last:
........last = n
........if max > maxInRow:
............maxInRow = max
........max = 1
if max > maxInRow:
....maxInRow = max
print(maxInRow)

Максимальная длина монотонного фрагмента.

"Есть последовательность натуральных чисел. Выясните самую большую длину монотонного фрагмента этой последовательности (то есть это фрагмент, где все элементы либо больше предыдущего, либо меньше). Ввод последовательности заканчивается при вводе нуля."

(описание взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/7AoX7/maksimal-naia-dlina-monotonnogho-fraghmienta)

Решение

n = int(input())
maxInRow = 0
maxI = 0
maxD = 0
last = n
if n != 0:
....maxI = 1
....maxD = 1
while n != 0:
....n = int(input())
....if n != 0 and n > last:
........maxI += 1
........if maxI > maxInRow:
............maxInRow = maxI
........maxD = 1
........last = n
....elif n != 0 and n < last:
........maxD += 1
........if maxD > maxInRow:
............maxInRow = maxD
........maxI = 1
........last = n
....elif n != 0 and n == last:
........maxD = 1
........maxI = 1
if maxI > maxInRow:
....maxInRow = maxI
print(maxInRow)

Решение вытекает из решения предыдущей задачи.

Наименьшее расстояние между локальными максимумами.

"Найдите минимальное расстояние между двумя локальными максимумами последовательности натуральных чисел. Ввод последовательности заканчивается при вводе нуля. Локальный максимум - такое число в последовательности, которое больше своих соседей. Если в последовательности нет двух локальных максимумов, то выведите число ноль."

(описание взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/dCRo6/naimien-shieie-rasstoianiie-miezhdu-lokal-nymi-maksimumami)

Решение

n2 = int(input())
n1 = 0
if n2 == 0:
....print(0)
elif n2 != 0:
....n1 = int(input())
if n2 != 0 and n1 == 0:
....print(0)
elif n2 != 0 and n1 != 0:
....n =
''
....nm = ''
....i = 2
....s = 10000000
....while n != 0:
........n = int(input())
........if n != 0 and n2 < n1 and n1 > n:
............if nm !=
'' and i - nm < s:
................s = i - nm
............nm = i
........i += 1
........n2 = n1
........n1 = n
....if s == 10000000:
........s = 0
....print(s)

Для решения нужно сохранять последние три значения последовательности и проверять является ли значение посередине локальным максимумом. Если является, то вычислять разность между порядковым номером в последовательности предыдущего максимума и номером текущего, что дает расстояние между ними.

Успехов в решении задач!