Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1 / LabsN2_0

.doc
Скачиваний:
10
Добавлен:
27.05.2015
Размер:
99.84 Кб
Скачать

10

Лабораторная работа по С++ № 2.

Циклы.

Для организации циклов в С++ используются следующие 3 оператора: while, for и do…while.

Цикл типа while.

Цикл типа while является циклом с предусловием. Он используется в случае, когда, во-первых, не известно точное число повторов и, во-вторых, при этом нет необходимости, чтобы цикл непременно был выполнен хотя бы один раз. Цикл типа while имеет следующую форму записи:

while (выражение) оператор;

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

* Запись ключевого слова while как While с символом W в верхнем регистре (помните, что язык С++ чувствителен к регистру) является ошибкой. Все зарезервированные ключевые слова в С++, такие, как while, if, else, содержат только символы нижнего регистра.

Пример 1. Как пример использования while рассмотрим фрагмент программы, определяющей первое значение степени 2, превышающее 1000. Предположим, что имеется целая переменная result, с начальным значением 2. Когда приведенная ниже структура повторения while закончит свою работу, result будет содержать искомую величину.

int result=2;

while (result<=1000)

result=2*result;

...

При входе в структуру while, значение переменной result равно 2. Эта переменная умножается на 2, принимая последовательно значения 4, 8, 16, 32, 64, 128, 256, 512, 1024. Когда result достигает значения 1024, условие структуры while — result<=1000 становится ложным. Это прекращает повторение и окончательное значение result будет равно 1024. Программа продолжает работу с первого оператора, следующего за while.

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

Пример 2. Проведен опрос группы из десяти студентов. Известны оценки по этому опросу (целые числа в диапазоне 0-100). Надо определить среднюю оценку группы.

#include <iostream.h>

void main(){

int counter=1, grade, total=0, average;

while (counter<=10){

cout<<”Введите оценку: \n”;

cin>>grade;

total=total+grade;

counter++;

}

average=total/10;

cout<<”Средняя оценка равна: ”<<average;

}

Здесь переменная total используется для наращивания суммы ряда величин. Переменная counter используется для счета — в данном примере для счета числа введенных оценок. Переменным, применяемым для хранения суммы, обычно должны быть заданы начальные нулевые значения перед их использованием в программе; в противном случае сумма может включать в себя то первоначальное значение, содержавшееся в области памяти, которая была отведена под эту переменную. Для переменных-счетчиков обычно задают значение 0 или 1, в зависимости от из использования.

Пример 3. Пользователю дается 10 попыток угадать заданное в программе число.

...

i=1, rez=1;

while (i++<=10&&rez!=25){

cout<<”\nВведите число: ”;

cin>>rez;

}

if (i==11) cout<<”\nВы не угадали!”;

else cout<<”\nПоздравляю! Вы угадали число!”;

В данном примере цикл выполняется до тех пор, пока не угадано число или не исчерпано количество попыток. Обратите внимание на то, что счетчик цикла изменяется не внутри самого цикла, а в условии продолжения. То есть в качестве такового условия может стоять не только условное выражения, а, в общем случае, допускается использование выражение произвольного типа, корректное с точки зрения синтаксиса языка С++. Цикл выполняется до тех пор, пока это выражение истинно. Для организации выполнения так называемых бесконечных циклов в качестве такого выражения применяется логическая константа true.

Пример 4. Данная программа демонстрирует пример бесконечного цикла, выполняющего счет до десяти.

#include <iostream.h>

void main(){

int counter=0;

while (true){

counter++;

if (counter>10) break;

}

cout<<”Counter: ”<<counter<<”\n”;

}

Результат программы – вывод на экран: counter: 11

Очевидно, что условие продолжения цикла, заданное в условии цикла while, будет выполняться всегда. В теле цикла значение переменной counter увеличивается на единицу. Работа цикла продолжается до тех пор, пока значение counter не превысит 10. Выполнение цикла прерывается оператором break, и на экран выводится значение переменной counter. Однако, несмотря на то, что программа работает, ее структуру нельзя назвать оптимальной. Это типичный пример некорректного использования оператора while.

Цикл типа do…while.

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

При использовании конструкции do…while условие проверяется после выполнения тела цикла. Это гарантирует выполнение операторов цикла по крайней мере один раз.

Форма записи цикла типа do…while:

do оператор while (выражение);

Структура этого цикла очень похожа на структуру while. Когда do…while завершается, выполнение программы продолжается с оператора, следующего за предложением while. Отметим, что в структуре do…while нет необходимости использовать фигурные скобки, если тело состоит только из одного оператора. Но фигурные скобки обычно все же ставят, чтобы избежать путаницы между структурами while и do…while. Например,

while (условие)

обычно рассматривается как заголовок структуры while. Структура do…while без фигурных скобок и с единственным оператором в теле имеет вид:

do

оператор

while (условие);

что может привести к путанице. Последняя строка – while (условие); может ошибочно интерпретироваться как заголовок структуры while, содержащий пустой оператор. Таким образом, чтобы избежать путаницы, структура do…while даже с одним оператором часто записывается в виде

do {

оператор

} while (условие);

Пример 5. Программа использует структуру do…while, чтобы напечатать числа от 1 до 10.

#include <iostream.h>

void main(){

int counter=1;

do {

cout<<counter<<” “;

} while (++counter<=10);

}

Результат на экране: 1 2 3 4 5 6 7 8 9 10

Обратите внимание, что к управляющей переменной counter в проверке окончания цикла применяется инкремент в префиксной форме. В случае использования постфиксного инкремента результат выполнения будет неверным (1 2 3 4 5 6 7 8 9 10 11). Отметим также использование фигурных скобок, заключающих единственный оператор в теле do…while.

Цикл типа for.

Цикл типа for является циклом с параметрами и обычно используется в случае, когда известно точное количество повторов вычислений. При этом осуществляется три операции: инициализация счетчика циклов, сравнение его величины с некоторым граничным значением и изменение значения счетчика при каждом прохождении тела цикла.

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

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

Форма записи цикла for:

for (выражение1; выражение2; выражение3) оператор;

Выражение1 вычисляется первым и вычисляется один раз – когда начинает выполняться цикл for. Обычно здесь производится инициализация счетчика циклов и переменных. Счетчик, как правило, представляет собой целочисленную переменную, которая объявляется и инициализируется прямо в цикле, хотя в С++ допускается использование в этом месте любого выражения, выводящего начальное значение счетчика каким-то косвенным путем. Выражение2 цикла for определяет условие продолжения цикла, которое также может быть представлено любым выражением. Это условие выполняет те же функции, что и в конструкции while. Выражение3 устанавливает значение приращения счетчика цикла (по умолчанию шаг приращения равен единице). В этой части также может использоваться любое корректное выражение или оператор С++.

Следует заметить, что, хотя параметры цикла for могут задаваться любыми корректными выражениями С++, для установки второго параметра лучше использовать выражение, возвращающее логическое значение. На самом деле, в качестве условия продолжения цикла можно применять не только выражения сравнения, образующие значение типа «истина-ложь». Для этого может быть использовано любое выражение. Так, если в результате вычисления подобного выражения получается нуль, тогда цикл завершается. А если результат вычисления оказывается ненулевым, тогда выполнение цикла продолжается (такое возможно потому, что в С++ значение false – 0, а значение true – любое значение кроме нуля).

Цикл for работает в такой последовательности:

  1. Присваивается начальное значение счетчику цикла.

  2. Вычисляется значение выражения, устанавливающего условие продолжения цикла.

  3. Если выражение условия возвращает true, то сначала выполняется тело цикла, а затем заданная операция над счетчиком цикла.

На каждой итерации шаги 2 и 3 повторяются.

Если условие продолжения цикла с самого начала не удовлетворяется, то операторы тела цикла for не выполняются и управление передается оператору, следующему за for.

Пример 6. Пусть требуется вычислить у10. Возможный вариант решения имеет вид:

...

cin>>y;

rez=1;

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

rez*=y;

...

Когда структура for начинает выполняться, управляющей переменной i задается начальное значение 1. Затем проверяется условие продолжения цикла i<=10. Поскольку начальное значение i равно 1, это условие удовлетворяется, так что оператор тела структуры будет выполняться. Затем управляющая переменная i увеличивается на единицу в выражении i++ и цикл опять начинается с проверки условия его продолжения. Поскольку значение i теперь 2, предельная величина не превышена, так что программа снова выполняет тело цикла. Этот процесс продолжается, пока управляющая переменная i не увеличится до 11 – это приведет к тому, что условие продолжения цикла нарушится и повторение прекратится. Выполнение программы продолжится с первого оператора, расположенного после структуры for.

Отметим, что цикл использует условие продолжения цикла i<=10. Если программист некорректно напишет i<10, то цикл выполнится всего 9 раз. Это типичная логическая ошибка, называемая ошибкой занижения (или завышения) на единицу.

«Приращение» структуры for может быть также и отрицательным – в этом случае в действительности происходит не приращение, а уменьшение переменной, управляющей циклом.

Пример 7. Эти примеры покажут способы изменения управляющей переменной в структуре for.

а) Изменение управляющей переменной от 1 до 100 с шагом 1:

for (i=1; i<=100; i++)

б) Изменение управляющей переменной от 1 до 100 с шагом -1:

for (i=100; i>=1; i--)

в) Изменение управляющей переменной от 7 до 77 с шагом 7:

for (i=7; i<=77; i+=7)

г) Изменение управляющей переменной в последовательности 2, 5, 8, 11, 14:

for (j=2; j<=20; j+=3)

Особенности цикла for.

В языке С++ оператор цикла for является более гибким средством, чем аналогичные операторы циклов в других языках программирования, например, Паскале, Бейсике, Фортране и т.д. Эта гибкость является следствием использования трех выражений в скобках после for:

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

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

...

int counter=0;

for ( ; counter<5; ) {

counter++;

cout<<counter<<” “;

}

...

В первой строке присваивается значение переменной. Установки параметров цикла for, показанные во второй строке, содержат только проверку условия продолжения цикла. Операция над переменной цикла в конструкции for также отсутствует. Таким образом, этот цикл можно представить в виде:

while (counter<5)

Рассмотренный пример еще раз показывает, что возможности С++ позволяют решить одну и ту же задачу множеством способов. Однако этот пример приведен скорее для иллюстрации гибкости возможностей С++, поскольку ни один опытный программист не будет использовать цикл for подобным образом. Тем не менее, можно опустить все три параметра цикла for, а для управления циклом использовать операторы break и continue.

Пример 9.

#include <iostream.h>

void main(){

int max, counter=0;

cout<<””;

cin>>max;

for (;;){

if (counter<max){

cout<<”Hello!\n”;

counter++;}

else break;

}

}

В этом примере набор параметров оператора for минимален. Опущены все три параметра – инициализации, условие и операция. Начальное значение счетчика присваивается еще при инициализации; условие продолжения цикла также проверяется в отдельной строке, и, если оно истинно, выполняется операция тела цикла, после чего увеличивается значение счетчика. Если условие не выполняется, оператор break прерывает выполнение цикла.

Несмотря на то, что рассмотренная программа выглядит достаточно нелепо, встречаются ситуации, когда конструкции for(;;) и while(true) оказываются просто необходимыми.

  1. Синтаксис задания цикла for позволяет инициализировать несколько переменных-счетчиков, проверять сложные условия продолжения цикла или последовательно выполнять несколько операций над счетчиками цикла. Если присваиваются значения нескольким счетчикам или выполняется несколько операций, они записываются последовательно и разделяются запятыми.

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

#include <iostream.h>

void main(){

for (i=0, j=0; i<3; i++, j++)

cout<<”i: “<<i<<” j: “<<j;

}

Результат: i:0 j:0

i:1 j:1

i:2 j:2

В заголовке цикла переменные i и j инициализируются нулевыми значениями. Затем проверяется условие i<3 и, так как оно истинно, выполняется первая итерация цикла. На каждой итерации осуществляется вывод значений счетчиков на экран. После этого выполняется третья часть конструкции for, в которой значение переменных-счетчиков увеличивается на единицу.

Пример 11. Используем структуру for для суммирования всех четных чисел от 2 до 100.

#include <iostream.h>

void main(){

int number, sum=0;

for (number=2; number<=100; number+=2)

sum+=number;

cout<<”Сумма равна “<<sum;

}

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

for (number=2; number<=100; sum+=number, number+=2)

Задание начального значения sum=0 также может быть включено в раздел задания начального значения. Таким образом, исходный код сократится до:

#include <iostream.h>

void main(){

int number, sum=0;

for (number=2, sum=0; number<=100; sum+=number, number+=2)

;

cout<<”Сумма равна “<<sum;

}

3) По сравнению с С в циклы С++ введено свойство, которое требует выполнения некоторой искусной настройки синтаксиса цикла for. Первоначально синтаксис этого цикла имел вид, описанный выше. В частности, область управления в структуре цикла for состояла из трех, определенных выше выражений, разделенных точками с запятой. Тем не менее, циклы С++ позволяют делать следующее:

for (int i=0; i<5; i++)

Это означает, что можно объявлять переменную в области инициализации цикла for. Подобное свойство может оказаться удобным, однако оно не соответствует первоначальному синтаксису языка С, поскольку объявление не является выражением. Такое незаконное поведение первоначально было согласовано благодаря определению нового вида выражения, выражения, включающего оператор объявления, которое представляло собой объявление без точки с запятой и которое могло использоваться только в операторе for. В результате синтаксис оператора for был видоизменен следующим образом:

for (объявление и инициализация переменной цикла; условие продолжения цикла; обновление переменной цикла)

тело цикла;

Модифицируем теперь код программы из примера 11:

#include <iostream.h>

void main(){

for (int number=2, sum=0; number<=100; sum+=number, number+=2)

;

cout<<”Сумма равна “<<sum;

}

Следует отметить, что такая переменная, объявленная в заголовке цикла for, в некоторых реализациях С++ существует только внутри структуры for. Это означает, что, после того как программа покинет данный цикл, указанная переменная прекращает свое существование. Набрав приведенный ниже фрагмент программного кода, можно проверить свой компилятор на соответствие:

#include <iostream.h>

void main(){

for (int i=0; i<5; i++){

cout<<”i: “<<i;

}

i=7;

}

Если такая программа будет компилироваться без ошибок, значит компилятор воспринимает переменную i и после выполнения цикла, в противном же случае компилятор сгенерирует сообщение об ошибке для выражения i=7.

Кроме описанных выше, существует еще много других возможностей применения этого типа циклов. Рассмотрим некоторые из них…

  1. Можно использовать символы в качестве счетчика.

Пример 12. Требуется напечатать алфавит. Возможное решение имеет вид:

...

for (chr=’A’; chr=’Z’; chr++) cout<<chr;

...

  1. Можно проверять любое другое условие, отличное от числа итераций.

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

Пример 13. Требуется подсчитать долг. Возможное решение имеет вид:

...

for (k=100; k<185; k*=1.1) cout<<”Долг=”<<k;

...

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

Пример 14. Использование выражения в качестве счетчика.

...

for (k=1; z<=196; z=5*k+23) cout<<z;

...

  1. Первое выражение не обязательно должно инициализировать переменные, оно может быть любого типа.

Пример 15. Произвольное первое выражение в заголовке цикла.

...

for (cout<<”Вводите числа.”; p<=30;) cin>p;

...

  1. Переменные, входящие в выражения спецификации цикла, можно изменять в теле цикла.

Пример 16. Изменение управляющих переменных в теле цикла.

...

delta=0.1;

for (k=0; k<500; k+=delta) if(a>b) delta=0.5;

...

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

Операторы break и continue.

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

Когда оператор break выполняется в структурах while, for, do…while или switch, происходит немедленный выход из структуры. Программа продолжает выполнение первого оператора после структуры. Обычное назначение оператора break — досрочно прерывать цикл или пропустить оставшуюся часть структуры switch.

Оператор continue в структурах while, for или do…while вызывает пропуск оставшейся части тела структуры и начинается выполнение следующей итерации цикла. В структурах while и do…while немедленно после выполнения оператора continue производится проверка условия продолжения цикла. В структуре for выполняется выражения приращения, а затем осуществляется проверка условия продолжения.

Пример 17. Применение оператора break в структуре for:

#include <iostream.h>

void main(){

for (int x=1; x<=10; x++){

if (x==5)

break;

cout<<x<<” “;

}

cout<<”Цикл прерван при х== “<<x;

}

Результат: 1 2 3 4

Цикл прерван при х==5

Пример демонстрирует прерывание в структуре повторения for. Когда структура if определяет, что x стал равен 5, выполняется оператор break. Это вызывает окончание работы оператора for и программа продолжает выполнение с сout после for. Цикл выполняется полностью только 4 раза.

Пример 18. Применение оператора continue в структуре for:

#include <iostream.h>

void main(){

for (int x=1; x<=10; x++){

if (x==5)

continue;

cout<<x<<” “;

}

cout<<”Использован continue для пропуска печати при х==5”;

}

Результат: 1 2 3 4 6 7 8 9 10

Использован continue для пропуска печати при х==5

В этом примере оператор continue используется в структуре for, чтобы пропустить оператор вывода при х равном 5 и начать следующую итерацию цикла.

Рекомендации по выбору циклов.

После того как выяснилось, что для решения задачи необходимо использовать оператор цикла, возникает вопрос: циклом какого типа лучше всего воспользоваться?

Сначала надо решить, нужен ли цикл с предусловием или с постусловием. Чаще всего возникает необходимость в цикле с предусловием. По оценкам специалистов, в среднем циклы с постусловием (do...while) составляют 5% от общего числа используемых циклов.

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

В случае выбора цикла с предусловием возникает второй вопрос: что лучше, for или while? В принципе все, что можно сделать с помощью одного цикла, можно сделать и с помощью другого. Исходя из соображений правильного стиля программирования применение цикла for представляется более предпочтительным, когда в цикле используется инициализация и коррекция переменной. А цикл while удобнее применять, когда этого делать не требуется.

Задания на программирование.

Задание 1. Найти и распечатать все натуральные трехзначные числа, равные сумме кубов своих цифр.

Задание 2. Дано положительное число а. Найти k-ое число Фибоначчи такое, что rk-1 <= a < rk

Числа Фибоначчи: r1=1, r2=1, rk=rk-2+rk-1, k=3,4…

Задание 3. Найти количество трехзначных чисел, кратных 15, но не кратных 30. Вывести эти числа на экран.

Задание 4. Введите месяц и день вашего рождения. Выясните, какой ближайший год будет счастливым (год называется счастливым, если остаток от деления суммы его цифр на 10 совпадает с аналогичным остатком суммы цифр месяца и дня рождения).

____

Задание 5. По заданному вещественному числу х вычислить значение х по следующей итерационной формуле: yi+1=0,5(yi+x/yi), y0=x.

Итерации прекратить при |yi+1-yi|<2*10-5.

Задание 6. По введенному натуральному числу М рассчитать все трехзначные десятичные числа, сумма цифр которых равна М. Посчитать также количество таких чисел или сообщить о том, что их нет.

Задание 7. Вычислить значение функции:

Sin(π/8+|x|) при х<0,3

f(x)=

Sin(x2+ π/2) при x>=0,3

Для значения аргумента x от –0,5 до 1,2 с шагом 0,1.

Задание 8. Вычислить сумму членов бесконечного ряда:

x-1 + (x-1)3 + … + (x-1)2n+1 + …

x+1 3(x+1)3 (2x+1)(x+1)2n+1

с точностью до члена ряда меньшего ε (10-5 <= ε <= 10-3).

Задание 9. Найти и распечатать все натуральные пятизначные числа, равные сумме пятых степеней своих цифр.

Задание 10. Вычислить значение функции:

ln|x/(1+y)| при х>=y

f(x)=

(1+x)/(1+y)*e -|x+y| при x<y

Для значений аргументов: x от –0,5 до 1,2 с шагом 0,1

y от 0,0 до 0,4 с шагом 0,05.

Задание 11. Натуральное число m представить в виде суммы квадратов двух натуральных чисел. Выдать сообщение, если такое представление невозможно.

Задание 12. Найти наибольший общий делитель (НОД) двух введенных натуральных чисел, используя алгоритм Евклида (алгоритм Евклида: вычитаем из меньшего большее до тех пор, пока они не сравняются, полученное в результате число и есть НОД).

Задание 13. Дано натуральное число n и действительное x. Вычислить:

S= sinx+sinsinx+…+sinsin…sinx

n раз

Задание 14. Даны числовой ряд и некоторое число ε . Найти сумму тех членов ряда, модуль которых больше или равен заданному ε . Общий член ряда имеет вид: an=2n*n!/nn.

Задание 15. Написать программу, которая приблизительно рассчитывает значение математической константы е, используя формулу:

е=1 + 1/1! + 1/2! + 1/3! …

Задание 16. Написать программу, которая приблизительно рассчитывает значение ех, используя формулу:

ех=1 + х/1! + х2/2! + х3/3! …

Задание 17. Одноклеточная амеба каждые 3 часа делится на 2 клетки. Определить, сколько амеб будет через n часов.

Задание 18. У гусей и кроликов вместе 64 лапы. Сколько может быть кроликов и гусей (указать все сочетания)?

Задание 19. Составить программу для проверки утверждения: «Результатами вычислений по формуле х2+Х+17 при 0<=x<=15 являются простые числа». Все результаты вывести на экран.

Задание 20. Найти наименьший номер члена последовательности, для которого выполняется условие |an-an-1|< ε. Вывести на экран этот номер и все элементы ai , где i=1,2,3…,n.

an=1/2*tgan-1 , где a1=0,5.

Задание 21. Натуральное число М называется совершенным, если оно равно сумме всех своих делителей, включая 1, но исключая себя. Найти и вывести на экран все такие числа меньшие заданного N.

Задание 22. Найти на отрезке [n,m] натуральное число, имеющее наибольшее количество делителей.

Задание 23. Игрок А объявляет двузначное число от 01 до 99. Игрок В меняет местами его цифры и прибавляет полученное число к сумме его цифр. Полученный результат он объявляет игроку А. Игрок А проделывает с ним ту же процедуру, и так они продолжают поступать поочередно, объявляя числа. От суммы чисел берется остаток от деления на 100, поэтому объявляются лишь двузначные числа. Какие числа может объявить игрок А на начальном шаге, чтобы какой-нибудь из игроков в некоторый момент объявил число 00.

Соседние файлы в папке 1