Перейти к содержимому

Цикл for как решать

  • автор:

Циклы в Паскале

При решении задач может возникнуть необходимость повторить одни и те же действия несколько или множество раз. В программировании блоки кода, которые требуется повторять не единожды, оборачиваются в специальные конструкции – циклы.

У циклов выделяют заголовок и тело. Заголовок определяет, до каких пор или сколько раз тело цикла будет выполняться. Тело содержит выражения, которые выполняются, если в заголовке цикла выражение вернуло логическую истину ( True , не ноль).

После того как достигнута последняя инструкция тела, поток выполнения снова возвращается к заголовку цикла. Снова проверяется условие выполнения цикла. В зависимости от результата тело цикла либо повторяется, либо поток выполнения переходит к следующему выражению после всего цикла.

В языке программирования Паскаль существует три вида циклических конструкций.

Блок-схемы циклов

Цикл for

Часто цикл for называют циклом со счетчиком. В Pascal этот цикл используется, когда число повторений не связано с тем, что происходит в теле цикла. То есть количество повторений известно заранее.

В заголовке цикла указываются два значения. Первое значение присваивается так называемой переменной-счетчику, от этого значения начинается отсчет количества итераций (повторений). Отсчет идет с шагом равным единице. Второе значение указывает, при каком значении счетчика цикл должен остановиться. Другими словами, количество итераций цикла определяется разностью между вторым и первым значением плюс единица. В Pascal тело цикла for не должно содержать выражений, изменяющих счетчик.

Цикл for существует в двух формах:

for счетчик := начало to конец do тело;

for счетчик := начало downto конец do тело;

Если между начальным и конечным значением счетчика указано ключевое слово to, то на каждом шаге цикла значение счетчика будет увеличиваться на единицу. Если же указано downto, то значение счетчика будет уменьшаться на единицу.

Счетчик — это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных.

Количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, уже точно известно, сколько раз цикл выполнится.

var i, n: integer; begin write('Количество знаков: '); readln(n); for i := 1 to n do write('*'); writeln; end.

Примеры выполнения кода:

Количество знаков: 5 *****
Количество знаков: 13 *************

Цикл while

В Паскаль цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true , то тело цикла выполняется, если false – то нет.

Когда тело цикла было выполнено, то ход программы снова возвращается в заголовок цикла. Условие выполнения тела снова проверяется (находится значение логического выражения). Тело цикла выполнится столько раз, сколько раз логическое выражение вернет истину. Поэтому очень важно в теле цикла предусмотреть изменение переменной, которая используется в заголовке цикла, таким образом, чтобы когда-нибудь обязательно наступала ситуация логической лжи. Иначе произойдет так называемое зацикливание — одна из самых неприятных ошибок в программировании.

var sum, n: integer; begin sum := 0; while sum < 100 do begin readln(n); sum := sum + n; end; writeln('Сумма: ', sum); end.

Примеры выполнения кода:

45 23 12 31 Сумма: 111
50 91 Сумма: 141

Цикл repeat

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false . Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.

В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while , здесь всё наоборот: в случае true происходит выход из цикла, в случае false – его повторение.

var sum, n: integer; begin sum := 0; repeat readln(n); sum := sum + n; until sum > 100; writeln('Сумма: ', sum); end.
35 71 Сумма: 106

Задачи: Цикл for в С++

Раз вы приступаете к задачам, значит уже знаете что такое цикл for. Рассмотрим несколько задач, в решении которых он применяется и, тем самым, закрепим полученные знания. Практика программирования – самый лучший способ разобраться с материалом и запомнить информацию надолго.

1. Написать программу, которая будет показывать на экран квадрат числа, введенного пользователем. Пользователь должен сам решать – выйти из программы или продолжить ввод. (Подсказка – необходимо запустить бесконечный цикл, в котором предусмотреть его прерывание, при наступлении определённого условия).

Показать код
Задача: оператор for 1
using namespace std ;
setlocale ( LC_ALL , "rus" ) ;
int digit = 0 ; // число для расчета
char exit = 'y' ; // для выхода или продолжения
cout << "Введите число: " ; cin >> digit ;
cout << "\nПродолжить ввод чисел - Y, Выйти - N: " ; cin >> exit ; // выбор пользователя
if ( exit != 'y' && exit != 'Y' )
break ; // прервать цикл

В задаче, как видите, предусмотрено продолжение работы, вне зависимости в каком регистре введена буква Y (в нижнем или в верхнем).

оператор for - задача 1

2. В спортзал ежедневно приходит какое-то количество посетителей. Необходимо предложить пользователю ввести такие данные: сколько человек посетило спортзал за день, ввести возраст каждого посетителя и в итоге показать возраст самого старшего и самого молодого из них, а так же посчитать средний возраст посетителей.

Показать код
Задача: оператор for 2
using namespace std ;
setlocale ( LC_ALL , "rus" ) ;
int age = 0 ; // будет вводить пользователь
int maxAge = 0 ; // для записи максимального количества лет
int minAge = 100 ; // для записи минимального количества лет
int sum = 0 ; // общая сумма для расчета среднего
int average = 0 ; // для записи среднего возраста посетителей
int amount = 0 ; // количество посетителей спортзала
cout << "Введите количество посетителей спортзала: " ; cin >> amount ;
for ( int i = 0 ; i < amount ; i ++ ) cout << "Введите возраст " << i + 1 << "-го посетителя: " ; // запрос на введение числа if ( age > maxAge ) // если оно больше, чем хранит переменная max
maxAge = age ; // записываем в неё это число
if ( age < minAge ) minAge = age ; sum += age ; // накопление общей суммы average = sum / amount ; // подсчет среднего возраста cout << "\nСредний возраст всех посетителей: " << average << endl ; cout << "\nСамый взрослый: " << maxAge << endl ; cout << "\nСамый молодой: " << minAge << endl ;

Переменную min мы инициализировали значением 100, чтобы программа могла корректно работать. Если бы она была инициализирована значением 0, условие if (age < minAge) не выполнялось бы никогда, так как age всегда больше 0. Таким образом значение переменной minAge всегда оставалось бы нулем.

оператор for - задача 2

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

3. На складе имеется определённое количество ящиков с яблоками (в нашем примере 15). Когда подъезжает машина для погрузки, попросить пользователя ввести, сколько ящиков загрузить в первую машину, во вторую и так далее, пока не закончатся ящики с яблоками. Предусмотреть тот случай, когда пользователь введёт количество ящиков больше, чем есть на складе.

Задачи на циклы

Ниже даётся детальное объяснение простых задач в помощь тем, кто ранее не программировал и только делает свои первые шаги в программировании. Изучив их, Вам будет легче перейти к более сложным задачам - уровень сложности 2.

Задача №1

Необходимо вывести на экран числа от 1 до 5. На экране должно быть:

Решение:

Решение задачи
class Test < public static void main ( String [ ] args ) < for ( int i = 1 ; i < = 5 ; i ++ ) < System . out . print ( i + " " ) ;

Комментарии к задаче:

Как видно из условия, числа увеличиваются от 1 до 5 с шагом 1. Есть определенная закономерность, не так ли? А значит, необходимо использовать цикл . Осталось только понять какой именно цикл нужно использовать? Мы точно знаем, что числа будут увеличиваться от 1 до 5. А раз мы точно знаем сколько раз будет повторяться цикл, можем использовать цикл for.

Пишем строчку с конструкцией цикла for:

Решение задачи
for ( int i = 1 ; i < = 5 ; i ++ ) <

  • int i = 1; - это начальное значение переменной
  • i
  • i++ - это шаг, с которым будет выполняться цикл. В данном случае мы использовали инкремент, а значит переменная будет увеличиваться на 1. То есть с 1 до 2, с 2 до 3, с 3 до 4, с 4 до 5.

А чтобы после каждого шага кода выводить новое значение переменной, мы написали вот эту строчку:

Решение задачи
System . out . print ( i + " " ) ;

Поскольку нам необходимо вывести числа строчкой: 1 2 3 4 5 мы используем System.out.print ()

Если бы мы использовали System.out.println(); числа бы были выведены на экран вот так:

Обязательно обращайте внимание на то, чтобы количество скобок открывающих < и закрывающих >совпадало. В нашем случае 3 открывающие и 3 закрывающие скобки.

Задача №2

Необходимо вывести на экран числа от 5 до 1. На экране должно быть:

Решение:

class Test < public static void main ( String [ ] args ) < for ( int i = 5 ; i > = 1 ; i -- ) < System . out . print ( i + " " ) ;

Комментарии к задаче:

Как видно из условия, числа уменьшаются от 5 до 1 с шагом 1. Есть определенная закономерность, не так ли? А значит, необходимо использовать цикл . Вопрос какой? Мы точно знаем, что числа будут уменьшаться от 5 до 1. А раз точно знаем сколько раз будет повторяться цикл, можем использовать цикл for.

Пишем строчку с конструкцией цикла for:

for ( int i = 5 ; i > = 1 ; i -- ) <

  • int i = 5; - это начальное значение переменной
  • i >=1; - это условие, при котором будет выполняться цикл
  • i- - декремент, то есть уменьшение переменной на 1. С 5 до 4, с 4 до 3, с 3 до 2, с 1 до 1

А с помощью этой строчки выводим на консоль значения переменной

System . out . print ( i + " " ) ;

Мы используем System.out.print (); поскольку нам необходимо вывести числа строчкой: 5 4 3 2 1

Если бы мы использовали System.out.println(); числа бы были выведены на экран вот так:

И снова напоминаем, обязательно обращайте внимание на то, чтобы количество скобок открывающих < и закрывающих >совпадало. В нашем случае снова 3 открывающие и 3 закрывающие скобки.

Задача №3

Необходимо вывести на экран таблицу умножения на 3:

Решение:

for ( int i = 1 ; i < = 10 ; i ++ )

  • int i = 1; - это начальное значение переменной
  • i
  • i++ инкремент, то есть увеличение переменной на 1. С 1 до 2, с 2 до 3, с 3 до 4 и т.д.

Разберем вот эту строчку с помощью которой мы выводим значения на консоль

import java . util . Scanner ;
class Test < public static void main ( String [ ] args ) < System . out . print ( "Введите любое целое положительное число: " ) ; Scanner sc = new Scanner ( System . in ) ; int n = sc . nextInt ( ) ; int sum = 0 ; for ( int i = 1 ; i < = n ; i ++ ) < sum = sum + i ; System . out . println ( sum ) ;

Комментарии к задаче:

Сначала мы должны предложить пользователю ввести любое целое положительное число. Это мы делаем с помощью этой строчки:

System . out . print ( "Введите любое целое положительное число: " ) ;

Чтобы считать с консоли введенное пользователем число, нам нужен сканер. Поэтому мы выполняем 3 шага.

Шаг №1 - подключаем сканер из библиотеки java.util с помощью этой строчки

import java . util . Scanner ;

Шаг №2 - объявляем сканер

Scanner sc = new Scanner ( System . in ) ;

Шаг №3 - считываем с консоли введённое целое число. Для этого используем метод nextInt ()

int n = sc . nextInt ( ) ;

В условиях задачи сказано, что числа будут суммироваться от 1 до введённого пользователем числа. Не кажется ли Вам, что это цикл? Да, конечно же это цикл. Причем мы заранее знаем сколько раз будут суммироваться числа: от 1 до n, где n – введённое пользователем число. А значит нам надо использовать цикл for.

Пишем строчку с конструкцией цикла for:

for ( int i = 1 ; i < = n ; i ++ )

По условию задачи, нам надо суммировать числа от 1 до n. Для этого перед циклом мы объявляем переменную int sum и присваиваем ей значение 0:

int sum = 0 ;

В переменную sum будут суммироваться числа с помощью цикла for

int sum = 0 ;
for ( int i = 1 ; i < = n ; i ++ ) < sum = sum + i ;

Далее с помощью этой строчки выводим результат суммирования на консоль

System . out . println ( sum ) ;

Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Обучаем с нуля.

По всем вопросам звоните:

+38 050 205 77 99

+38 098 205 77 99

Или читайте информацию по нашим курсам Java c нуля у нас на сайте.

  • ← Циклы в Java
  • Условный оператор if в Java. Оператор switch →

[ Сборник задач ]
Тема 10. Работа с циклами

Определение циклов ( loops ) и их структура в языке Python, особенности использования, различия. Конструкции прерывания циклов глобально и на уровне конкретной итерации ( continue , break ). Инструменты, заменяющие циклы.

Вопросы и ответы
5 вопросов по теме "Работа с циклами" + ответы
Условия задач
5 задач по теме двух уровней сложности: Базовый и *Продвинутый
Решения задач
Приводим код решений указанных выше задач

One

В языке программирования Python циклы существенно проще и яснее для понимания, нежели в ряде других. Некоторые языки предоставляют 3-5 конструкций циклов, иные – и вовсе не имеют таких структур (ряд чисто функциональных языков программирования). В Питоне имеется только два типа циклов: while и for .

1. Конструкция цикла while

 while : else:

2. Конструкция цикла for

 for : else:

Цикл for позволяет перебирать элементы по индексу или напрямую.

Оба вида циклических структур могут включать условные выражения и специальные «прерыватели»: continue , break .

Для успешного решения заданий необходимо понимать устройство циклов в Python, уметь использовать вложенные циклы, стремиться минимизировать количество итераций (при такой возможности).

Читайте также

Программирование на Python. Урок 3. Функции, условные выражения и циклы.

Разбираемся с функциями в Python: аргументы, тело, возвращаемое значение. Изучаем структуру и синтаксис условного оператора if..elif..else. Учимся писать циклы for и while. Решаем задачи.

Программирование на Python. Урок 2. Типы данных

Разбираем типы данных в Python: списки, кортежи, словари, множества и т. д. Рассматриваем часто используемые способы ввода-вывода данных. Решаем задачи.

Two

Вопросы по теме "Работа с циклами"
1. В чем основное отличие циклов for и while ?

Несмотря на то, что и for и while необходимы для повторения некоего количества раз одной и той же операции , циклы отличаются друг от друга и имеют свою специфику. Даже с учетом их формальной взаимозаменяемости.

While удобен тогда, когда повторяющаяся операция проводится до тех пор, пока условие верно, т.е. возвращает True . Отсюда возможна ситуация, когда цикл не сработает ни разу либо будет повторяться бесконечно. Чтобы была возможность применить данный вид цикла для объекта, тот обязан иметь атрибут __bool__() .

Цикл for применяется для последовательного манипулирования с элементами итератора. Другими словами, он проходит по очереди элементы объекта (например, списка) и заканчивается (в общем случае) после их полного перебора.

Таким образом, for удобен для перебора, а while – проверки истинности условия перед каждой итерацией.

2. Приведите пример бесконечного цикла. Применяется ли он на практике?

Проще всего бесконечный цикл привести на примере цикла while . Так как он проверяет истинность условия, то его искусственно можно сделать таковым всегда.

Пример – Интерактивный режим
----
>>> while True:
. x = 10

Вместо явного указания True можно использовать любую комбинацию, результирующую в истинность (например, 1 + 1 == 2, 7 > 5 , bool('Python') и т.п.)

Любой код, написанный после данного цикла, не будет достигнут.

Инструкция for редко приводит к возникновению бесконечных циклов. Правда, и ее возможно принудить к бесконечному выполнению.

Пример – Интерактивный режим
----
>>> from itertools import count
>>> for number in count():
. number += 7

Функция count() последовательно выводит все числа от 1 до бесконечности с шагом 1 (т.е. 1, 2, 3, 4… ) по умолчанию.

Может показаться, что бесконечные циклы никому не нужны. Однако, они достаточно часто применяются (например, окно программы, которое будет показываться до тех пор, пока вы его принудительно не закроете).

3. Сработает ли инструкция else в нижеследующем примере? Поясните ответ.

Пример – IDE
----
for letter in 'программист':
____if letter == 'П':
________break
else:
____print('Перебор букв в слове закончен')

Как известно, инструкция else в циклах срабатывает только в том случае, когда цикл не прерван командой break . В нашем примере имеется данная команда. Тем не менее, в слове программист были перебраны все буквы и не найдена заглавная П , которая бы его прервала.

Поэтому ответ очевиден: else сработает. Проверим.

Пример – Интерактивный режим
----
>>> for letter in 'программист':
. if letter == 'П':
. break
. else:
. print('Перебор букв в слове закончен')
.
Перебор букв в слове закончен

4. Какова вычислительная сложность цикла for , перебирающего элементы множества (сколько нужно совершить операций)?

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

Для этого приходится определять сложность решения « О большое » (асимптотическая нотация, нотация Бахмана-Ландау). Это позволяет понять, насколько оптимален алгоритм.

Так, при переборе элементов множества через цикл for в худшем случае потребуется пройтись по каждому из них. Следовательно, необходимо осуществить количество операций, равное размеру объекта.

В обозначениях асимптотической нотации это выглядит так: O(n) , где n – размер множества.

5*. Замените цикл for в примере ниже на 2 другие структуры (представьте, что for в классическом виде использовать нельзя, но код должен вернуть требуемый результат).

Пример – IDE
-----
lst = [2, 4, 5, 8, 9, 13]
for number in range(len(lst)):
____lst[number] *= number
print(lst)

Результат выполнения
---
[0, 4, 10, 24, 36, 65]

Как видно из задания, нам требуется создать новый список, в котором каждое число умножается на его индекс.

Цикл for в приведенном примере легко заменяется списковым включением или функцией map.

1 - Списковое включение

Пример – IDE
----
lst = [2, 4, 5, 8, 9, 13]
lst = [lst[number] * number for number in range(len(lst))]
print(lst)

Результат выполнения
----
[0, 4, 10, 24, 36, 65]
2 – Функция map()

2 – Функция map()

Пример – IDE
----
lst = [2, 4, 5, 8, 9, 13]
lst = list(map(lambda number: number * lst.index(number), lst))
print(lst)

Результат выполнения
----
[0, 4, 10, 24, 36, 65]

Three

Задачи по теме "Работа с циклами"

На вход функция more_than_five(lst) получает список из целых чисел. Результатом работы функции должен стать новый список, в котором содержатся только те числа, которые больше 5 по модулю.

Евгению предоставили строку, состоящую из русских букв разных регистров, и попросили очистить ее от заглавных литер. Как ему показалось, он написал верный код, но результат совсем не порадовал. Ниже представлен пример работы «чистильщика строк», которому срочно требуется ваша помощь.

Пример – IDE
----
letters = 'ЫгВЫоЯСремДШНККАыкЩЙФа'
for letter in letters:
____if letter.upper() = letters:
________letters.replace(letter, '')
print(letters)

Анна решила представить некую таблицу с заглавными и строчными буквами русского алфавита в красивом формате. Об этом ее попросили англоязычные друзья из социальных сетей.

Недолго думая девушка создала скрипт, который выполнял подобную операцию. Результат работы программы продемонстрирован ниже. Сможете повторить (в строках с галочками - их 27 штук, чтобы вам не пришлось долго считать)? Для идентичности результатов примените любой моноширинный шрифт (в котором все символы имеют одинаковую ширину).

Для идентификации своего круга проверенных лиц будущий тайный агент (ведь все о чем-то мечтают) Максим решил пускать на свою страничку в Интернете только тех, чьи никнеймы есть в его секретном списке. Он уверен в своих людях (особенно в том, что они по глупости не расскажут никому своё секретное прозвище), как и в том, что имена товарищей невозможно подобрать случайно.

К слову, вот этот список: Мавпродош, Лорнектиф, Древерол, Фиригарпиг, Клодобродыч. По мере увеличения круга знакомых Максим, естественно, дополнит данный список.

Ваша задача такова: повторите код, который будет спрашивать у пользователя его ник и либо пускать на сайт (выведется сообщение Т ы – свой. Приветствую, любезный ! ), либо нет (в этом случае будет такой текст: Тут ничего нет. Еще есть вопросы? . Фактически, будущий супергерой решил поиздеваться над теми, кого нет в его удивительном перечне, так как им будет показываться это сообщение постоянно. Очень коварный замысел!).

Для проверки прозвищ посетителей используйте встроенную функцию input() .

Валентина прогуляла лекцию по математике. Преподаватель решил подшутить над нерадивой студенткой и попросил ее на практическом занятии перечислить все положительные делители некоторых целых чисел. Для несложных примеров студентка быстро нашла решения (для числа 6 это: 1, 2, 3, 6 ; а для числа 16 это: 1, 2, 4, 8, 16 ), но этим все не закончилось. На домашнее задание ей дали варианты посложнее: 23436 , 190187200 , 380457890232 .

Решить такое вручную, как вы понимаете, практически нереально. Вот Валентина и обратилась к вам за помощью. Помогите ей (при помощи функции all_divisors(number) ). Постарайтесь найти самое оптимальное решение. Результат представьте в виде списка (не забудьте отсортировать по возрастанию).

Two

Задача 1. Базовый уровень

 На вход функция more_than_five(lst) получает список из целых чисел. Результатом работы функции должен стать новый список, в котором содержатся только те числа, которые больше 5 по модулю. 

Для решения задачи воспользуемся циклом for .
Пример – IDE

 def more_than_five(lst): new_lst = [] for number in lst: if abs(number) > 5: new_lst.append(number) return new_lst # Тесты print(more_than_five([-11, 4, -2, 90, 400, 0, -5])) print(more_than_five([-2, 2, 3, 4, 0, -1])) print(more_than_five([70, -900, 41, 0])) 

Результат выполнения

 [-11, 90, 400] [] [70, -900, 41] 

Задача 2. Базовый уровень

 Евгению предоставили строку, состоящую из русских букв разных регистров, и попросили очистить ее от заглавных литер. Как ему показалось, он написал верный код, но результат совсем не порадовал. Ниже представлен пример работы «чистильщика строк», которому срочно требуется ваша помощь. Пример – IDE ---- letters = 'ЫгВЫоЯСремДШНККАыкЩЙФа' for letter in letters: ____if letter.upper() = letters: ________letters.replace(letter, '') print(letters) 

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

Что ж, давайте думать, что нужно исправить:
- в условии if явно не хватает второго знака равно, так как мы не присваиваем переменную, а проверяем ее истинность;
– каждую букву в верхнем регистре нужно сравнивать не со всем набором символом, а с одним знаком;
- заменяя буквы на пустые символы мы создаем новую строку, которую никак не сохраняем. В итоге изначальный объект не поменяется. Нужно создать пустую строку и дополнять ее верными символами, пропуская ненужные. А раз требуется сохранить прежнее название строки, то мы переприсвоим исходной вновь полученную.

Пример - IDE

 letters = 'ЫгВЫоЯСремДШНККАыкЩЙФа' clean_string = '' for letter in letters: if not letter.isupper(): clean_string += letter letters = clean_string print(letters) 

Результат выполнения

 горемыка 

Задача 3. Базовый уровень

 Анна решила представить некую таблицу с заглавными и строчными буквами русского алфавита в красивом формате. Об этом ее попросили англоязычные друзья из социальных сетей. Недолго думая девушка создала скрипт, который выполнял подобную операцию. Результат работы программы продемонстрирован ниже. Сможете повторить (в строках с галочками - их 27 штук, чтобы вам не пришлось долго считать)? Для идентичности результатов примените любой моноширинный шрифт (в котором все символы имеют одинаковую ширину). ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | А а || К к || Х х | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Б б || Л л || Ц ц | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | В в || М м || Ч ч | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Г г || Н н || Ш ш | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Д д || О о || Щ щ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Е е || П п || Ъ ъ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Ё ё || Р р || Ы ы | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Ж ж || С с || Ь ь | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | З з || Т т || Э э | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | И и || У у || Ю ю | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Й й || Ф ф || Я я | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

В идеале требуется провести минимум «издевательств» над входящими данными (т.е. над алфавитом). В нашем случае мы просто записали все буквы русского алфавита в строку.

Также, в задаче требовалось понять алгоритм разбиения знаков на 3 столбца.

Пример – IDE

 rus_lower = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' for position in range(11): print('^' * 27) for letter in rus_lower: if rus_lower.index(letter) % 11 == position: print('| ', letter.upper(), letter, ' |', end='') print() print('^' * 27) 

Результат выполнения

 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | А а || К к || Х х | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Б б || Л л || Ц ц | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | В в || М м || Ч ч | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Г г || Н н || Ш ш | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Д д || О о || Щ щ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Е е || П п || Ъ ъ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Ё ё || Р р || Ы ы | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Ж ж || С с || Ь ь | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | З з || Т т || Э э | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | И и || У у || Ю ю | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | Й й || Ф ф || Я я | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Задача 4. Базовый уровень

 Для идентификации своего круга проверенных лиц будущий тайный агент (ведь все о чем-то мечтают) Максим решил пускать на свою страничку в Интернете только тех, чьи никнеймы есть в его секретном списке. Он уверен в своих людях (особенно в том, что они по глупости не расскажут никому своё секретное прозвище), как и в том, что имена товарищей невозможно подобрать случайно. К слову, вот этот список: Мавпродош, Лорнектиф, Древерол, Фиригарпиг, Клодобродыч. По мере увеличения круга знакомых Максим, естественно, дополнит данный список. Ваша задача такова: повторите код, который будет спрашивать у пользователя его ник и либо пускать на сайт (выведется сообщение «Ты – свой. Приветствую, любезный !»), либо нет (в этом случае будет такой текст: «Тут ничего нет. Еще есть вопросы?». Фактически, будущий супергерой решил поиздеваться над теми, кого нет в его удивительном перечне, так как им будет показываться это сообщение постоянно. Очень коварный замысел!). Для проверки прозвищ посетителей используйте встроенную функцию input(). 

Данное задание удобно решать через while/else .
Пример - IDE

 nick = input() secret_list = ['Мавпродош', 'Лорнектиф', 'Древерол', 'Фиригарпиг', 'Клодобродыч'] while nick not in secret_list: print('Тут ничего нет. Еще есть вопросы?') nick = input() else: print(f'Ты – свой. Приветствую, любезный !') 

Результат выполнения

 >Агент007 Тут ничего нет. Еще есть вопросы? >Нету( Тут ничего нет. Еще есть вопросы? >ЕСТЬ. Тут ничего нет. Еще есть вопросы? >Мавпродош Ты – свой. Приветствую, любезный Мавпродош! 

Задача 5. *Продвинутый уровень

 Валентина прогуляла лекцию по математике. Преподаватель решил подшутить над нерадивой студенткой и попросил ее на практическом занятии перечислить все положительные делители некоторых целых чисел. Для несложных примеров студентка быстро нашла решения (для числа 6 это: 1, 2, 3, 6; а для числа 16 это: 1, 2, 4, 8, 16), но этим все не закончилось. На домашнее задание ей дали варианты посложнее: 23436, 190187200, 380457890232. Решить такое вручную, как вы понимаете, практически нереально. Вот Валентина и обратилась к вам за помощью. Помогите ей (при помощи функции all_divisors(number)). Постарайтесь найти самое оптимальное решение. Результат представьте в виде списка (не забудьте отсортировать по возрастанию). 

Для решения задания важно не просто подойти к делу в лоб. Требуется оптимизация алгоритма для минимизации времени расчета.

Первое, что приходит на ум – простой перебор всех вариантов. Каким бы мощным не был ваш ПК, число в 380 млрд он будет долго итерировать.

Вторая идея – перебрать все числа только до половины искомого числа (и добавить после этого еще и само число в список). Но и этот вариант не особо сокращает время.

Самый оптимальный вариант – перебрать числа до квадратного корня из искомого. Чтобы пояснить решение, приведем пример попроще. Возьмем число 100 . Оно делится на 1 и на само себя. Сразу заносим в список очевидный набор. Затем начинаем с двойки и идем по всем возможным числам. 100 делится на 2 , его заносим в список, но результат (т.е. 100 : 2 = 50 ) также является делителем числа 100 . Его тоже сразу добавляем. Аналогично поступаем далее, находя пары делителей: (4, 25) , (5, 20) , (10, 10) . Итак, мы дошли до корня квадратного из 100 . Число 10 повторяется, поэтому следует его добавить лишь 1 раз. Есть ли смысл идти дальше в поиске делителей? Ведь далее получим такие делители: 20 , 25 , 50 и 100 , но мы их уже занесли в список. Получается, проверка делителей до корня квадратного из любого положительного числа вполне достаточна.

Пример - IDE

 def all_divisors(number): lst = [1, number] for i in range(2, 1 + int(number ** 0.5)): if number % i == 0: lst.extend() return sorted(lst) # Тесты print(all_divisors(23_436)) print(all_divisors(190_187_200)) print(all_divisors(380_457_890_232)) 

Результат выполнения

 [1, 2, 3, 4, 6, 7, 9, 12, 14, 18, 21, 27, 28, 31, 36, 42, 54, 62, 63, 84, 93, 108, 124, 126, 186, 189, 217, 252, 279, 372, 378, 434, 558, 651, 756, 837, 868, 1116, 1302, 1674, 1953, 2604, 3348, 3906, 5859, 7812, 11718, 23436] [1, 2, 4, 5, 7, 8, 10, 14, 16, 20, 25, 28, 32, 35, 40, 50, 56, 64, 70, 80, 100, 112, 140, 160, 175, 200, 224, 280, 320, 350, 400, 448, 560, 700, 800, 1120, 1400, 1600, 2240, 2800, 5600, 11200, 16981, 33962, 67924, 84905, 118867, 135848, 169810, 237734, 271696, 339620, 424525, 475468, 543392, 594335, 679240, 849050, 950936, 1086784, 1188670, 1358480, 1698100, 1901872, 2377340, 2716960, 2971675, 3396200, 3803744, 4754680, 5433920, 5943350, 6792400, 7607488, 9509360, 11886700, 13584800, 19018720, 23773400, 27169600, 38037440, 47546800, 95093600, 190187200] [1, 2, 3, 4, 6, 7, 8, 12, 14, 17, 21, 24, 28, 34, 42, 51, 56, 68, 84, 102, 119, 136, 168, 204, 238, 289, 357, 408, 476, 578, 714, 867, 952, 1156, 1428, 1734, 2023, 2312, 2856, 3468, 4046, 6069, 6936, 8092, 12138, 16184, 24276, 48552, 7836091, 15672182, 23508273, 31344364, 47016546, 54852637, 62688728, 94033092, 109705274, 133213547, 164557911, 188066184, 219410548, 266427094, 329115822, 399640641, 438821096, 532854188, 658231644, 799281282, 932494829, 1065708376, 1316463288, 1598562564, 1864989658, 2264630299, 2797484487, 3197125128, 3729979316, 4529260598, 5594968974, 6793890897, 7459958632, 9058521196, 11189937948, 13587781794, 15852412093, 18117042392, 22379875896, 27175563588, 31704824186, 47557236279, 54351127176, 63409648372, 95114472558, 126819296744, 190228945116, 380457890232] 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar