8-11 классыВремя выполнения: 3 часа
Задача 1. Число Оценка 10 баллов. Задано натуральное число. Записать его в обратном порядке. Например, 12345 должно превратиться в 54321. Решение Var x:longint; Задача 2. «Количество чисел, не делящихся на 2, 3 или 5» (20 баллов) Оценка 10 баллов. Задано натуральное число N. Требуется написать программу, которая находит количество натуральных чисел, не превышающих N и не делящихся ни на одно из чисел 2,3,5. Формат входных данных Вводится число N (1 < N <1000000000). Формат выходных данных Вывести найденное число. Пример входных данных: 10 Пример выходных данных: 2 Решение Решение по перебору всех вариантов от 2 до N, которое может быть равно 999999999, потребует больших временных затрат, т.е. писать s:=0; for i:=1 to n do if (i mod 2<>0) and (i mod 3<>0) and (i mod 5<>0) then s:=s+1; нельзя! Число чисел от 1 до N, делящихся на 2 равно N div 2, подобным образом, число чисел, делящихся на 3 равно N div 3, и число чисел, делящихся на 5 равно N div 5. Тогда, число чисел не делящихся на 2, 3, 5 с учетом того, что, например 6 делится и на 2, и на 3, a 10 делится на 2 и на 5, 45 делится на 3 и на 5, равно: Var n,s:longint; Задача 3. Шахматная доска Оценка 15 баллов. Из шахматной доски по границам клеток выпилили связную (очевидно, связанную) (не распадающуюся на части) фигуру без дыр. Требуется определить её периметр. Формат выходных данных Сначала вводится число N (1≤N≤64) — количество выпиленных клеток. В следующих N строках вводятся координаты выпиленных клеток, разделенные пробелом (номер строки и столбца — числа от 1 до 8). Каждая выпиленная клетка указывается один раз. Формат выходных данных Выведите одно число — периметр выпиленной фигуры (сторона клетки равна единице). Примеры
Решение Периметры ВСЕХ вырезанных клеток равны 4*N. Если из этого числа вычесть число общих границ клеток умноженное на 2, то мы получим искомый периметр. Примем двумерный массив 8х8 за шахматную доску. Введенные клетки обозначим единицами. Общие границы клеток определим, просматривая клетки массива по вертикали и по горизонтали. Const m=8; Задача 4. Римские числа Оценка 15 баллов. Имя входного файла b.in Входной файл содержит одну строку, в которой записано римское число от единицы до десяти. Вывести его десятичный эквивалент. Римское число записывается с помощью символов латиницы I, V, X, между которыми нет разделителей. Формат входных данных Ввод производится из файла b.in. Во входном файле записана строка римского числа. Формат выходных данных Вывести на экран десятичный эквивалент римского числа. Примеры
Решение Римские цифры — цифры, использовавшиеся древними римлянами в своей непозиционной системе счисления. Натуральные числа записываются при помощи повторения этих цифр. При этом, если большая цифра стоит перед меньшей, то они складываются (принцип сложения), если же меньшая — перед большей, то меньшая вычитается из большей (принцип вычитания). Последнее правило применяется только во избежание четырёхкратного повторения одной и той же цифры. Римские цифры появились около 500 лет до нашей эры у этрусков. Лишь в XV веке римские цифры были постепенно заменены арабскими (индийскими) цифрами.
Мы рассматриваем более широкую задачу — написать программу переводящую римское число в десятичный (арабский) эквивалент. Var s:string; Задача 5. Задача Иосифа Флавия Оценка 20 баллов. Существует легенда, что Иосиф Флавий — известный историк первого века — выжил и стал известным благодаря математической одаренности. В ходе иудейской войны он в составе отряда из 41 иудейского воина был загнан римлянами в пещеру. Предпочитая самоубийство плену, воины решили выстроится в круг и последовательно убивать каждого третьего из живых до тех пор, пока не останется ни одного человека. Однако Иосиф наряду с одним из своих единомышленников счел подобный конец бессмысленным — он быстро вычислил спасительные места в порочном круге, на которые поставил себя и своего товарища. И лишь поэтому мы знаем его историю. В нашем варианте мы начнем с того, что выстроим в круг N человек, пронумерованных числами от 1 до N, и будем исключать каждого k-ого до тех пор, пока не уцелееет только один человек. Например, если N=10, k=3, то сначала умрет 3-й, потом 6-й, затем 9-й, затем 2-й, затем 7-й, потом 1-й, потом 8, за ним — 5-й, и потом 10-й. Таким образом уцелеет 4-й. Задача: определить номер уцелевшего. Входные данные: числа N и k. Ограничения: 1≤N≤500, 1≤k≤100. Выходные данные: программа должна выдавать номер уцелевшего человека на экран. Формат входных данных 10 3 Формат выходных данных 4 Решение Возьмем массив записей, в который введем номера людей от 1 до N и пометки "true". В цикле while, изменяя номера людей от m=k с шагом k до значения превышающего N (m<=N), помечаем "false" номера выводимых из круга. При этом по окончании цикла m>N, m-начало счета, будет равно m:=m-n Перепишем элементы с меткой "true" во вспомогательный массив b, считая количество переписваемых элементов j. Если с начала j=1, то число переписанных элементов будет j-1. Массив b перепишем в массив a, при этом n=j-1. Все повторяем до тех пор, пока n не станет равным 1. В первом (единственном) элементе масссива Type В статье Википедия. Задача Иосифа Флавия приведена более короткая программа: Const nmax=500; Скачать эту программу
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||