Олимпиадные задач с решениями
на языке
программирования Паскаль
Задача 1
Компьютер в первую секунду печатает на экране 1, во вторую – число 12, в третью – число 23. То есть, в каждую следующую секунду – на 11 больше, чем в предыдущую. В какую секунду впервые появится число, делящееся на 2009?
Купенова Гегани Мгеровна
Олимпиадные задач с решениями
на языке
программирования Паскаль
Задача 1
Компьютер в первую секунду печатает на экране 1, во вторую – число 12, в третью – число
23. То есть, в каждую следующую секунду – на 11 больше, чем в предыдущую. В какую секунду
впервые появится число, делящееся на 2009?
Программа
program z1;
var
k,x:integer;
Begin
k:=1;
x:=1;
while x mod 2009<>0 do
begin
k:=k+1;
x:=x+11;
end;
writeln ('Через ', k, ' секунд');
end.
Задача 2
Найдите количество четных цифр в десятичной записи числа n.
Пример
1486
Входные данные
Результат
3371
Программа
0
program z2;
var
x, y, k:integer;
Begin
readln (x);
k:=0;
while x<>0 do
begin
y:=x mod 10;
if y mod 2 =0 then k:=k+1;
x:=x div 10;
end;
writeln ('k=',k);
end.
Задача 3
Выясните, лежат ли на одной прямой точки А(x1, y1), B(x2, y2), C(x3, y3)
Пример
Входные данные
x1=1 y1=1
x2=6 y2=3
x3=11 y3=5
Программа
Результат
Точки лежат на одной прямой
program z3;
var
x1, x2, x3, y1, y2, y3, z, n:real;
Begin
write (‘Введите координаты точки А ');
readln (x1,y1);
write (‘Введите координаты точки В ');
readln (x2,y2);
write (‘Введите координаты точки C ');
readln (x3,y3);
z:=(x3x1)/(y3y1);
n:=(x3x2)/(y3y2);
if (z=n) and (z=(x2x1)/(y2y1)) then
writeln ('Точки лежат на одной прямой’)
else
writeln ('Точки не лежат на одной прямой’);end.
Задача 4
Сообщество роботов живет по следующим законам: один раз в год они объединяются в
полностью укомплектованные группы по 3 или 5 роботов (причем число групп из 3 роботов
максимально возможное). За год группа из 3 роботов собирает 5, а группа из 5 9 новых
собратьев. Каждый робот живет 3 года после сборки. Известно начальное количество роботов
(К>7), все они только что собраны. Определить, сколько роботов будет через N лет.
Входные данные
Результат
152
143702
Пример
8 3
10 10
Программа
program z4;
var k, i, n, p:integer;
s, x, y:longint;
r:array [1..3] of longint;
Begin
write('количество роботов k='); readln(k);
write('количество лет n='); readln(n);
r[1]:=k; r[2]:=0; r[3]:=0; s:=k;
for i:=1 to n do
begin
x:=s div 3;
p:=s mod 3;
if p=0 then y:=0
else if p=1 then begin x:=x3; y:=2 end
else begin x:=x1; y:=1 end;
r[3]:=r[2]; r[2]:=r[1]; r[1]:=5*x+9*y;
s:=r[1]+r[2]+r[3];
end;
writeln (‘Количество роботов ’,s);
end.
Задача 5Суточный рацион коровы составляет a кг сена, b кг силоса и c кг комбикорма. В
хозяйстве, содержащем стадо из k голов, осталось x центнеров сена, y тонн силоса и z мешков
комбикорма по 50 кг. Сколько еще дней хозяйство сможет кормить коров по полному рациону.
Программа
program z5;
var
a,b,c,x,y,z,kol,r:real;
Begin
readln (a,b,c);
readln (x,y,z);
readln (r);
x:=int(x*100/a);
y:=int(y*1000/b);
z:=int(z*50/c);
kol:=0;
if (x>=r) and (y>=r) and (z>=r) then
begin
end;
writeln (kol);
end.
Задача 6
if (x<=y) and (x<=z) then kol:=int(x/r);
if (y0) and (kol<50) do
begin
kol:=kol+1;
k:=k+k*(p/100);
k:=kr;
end;
if kol>=50 then writeln ('no') else writeln (kol);
end.Задача 7
Дано два целых положительных числа: a и b. Требуется написать программу, которая
находит цифру, на которую оканчивается число a^b.
Входные данные
Результат
a=2
b=4
Программа
6
program z7;
var
a,b,d:integer;
c:byte;
Begin
writeln ('Введите a'); readln (a);
writeln ('Введите b'); readln (b);
d:=a;
if b=1 then writeln (a)
else
begin
for c:=2 to b do
d:=d*a;
d:=d mod 10;
end;
writeln (d);
end.
Задача 8
Из одного порта в другой необходимо перевезти 15 различных грузов. Грузоподъемность
судна, на котором будет проходить перевозка, 50 тонн. Грузы пронумерованы, и информация о
массах грузов хранится в массиве М(15). Определить, сколько рейсов необходимо сделать
судну, если грузы неделимы и могут перевозиться только подряд в порядке их нумерации.
(Предполагается, что масса отдельного груза не превышает 50 тонн).
Программа
program z8;
type
mas=array[1..15] of integer;
var
m:mas;
k,i,s:integer;
Begin
for i:=1 to 15 do
begin
writeln ('Введите m','[',i,']');readln (m[i]);
end;
k:=1; i:=1; s:=0;
repeat
if s+m[i]<=50 then
begin
s:=s+m[i];
i:=i+1;
end
else
begin
k:=k+1;
s:=0;
end;
until i>15;
writeln ('Потребовалось, k,'рейсов');
Задача 9
Коммерсант, имея стартовый капитал k рублей, занялся торговлей, которая ежемесячно
увеличивает капитал на p%. Через сколько лет он накопит сумму s, достаточную для покупки
собственного магазина?
Пример
Входные данные
Результат
200000
5
3000000
Программа
4
program z9;
var
s,k,p:real;
n:integer;
Begin
writeln ('Введите стартовый капитал');
readln(k);
writeln ('Введите % увеличения капитала');
readln(p);
writeln ('Введите сумму, необходимую для покупки магазина');
readln(s);
while k 0) and (c <> 0) and (i mod (a * b * c) = 0) then writeln (i);
end;
end.
Задача 11
На конференцию приехало N
человек. Для их перевоза выделили автомобили
вместимостью К и М человек (без водителя). К гостинице автомобили подаются в таком
порядке: сначала вместимостью К человек, потом – М человек и так далее. В автомобиле можно
перевозить не более максимально допустимого количества пассажиров. Определить, сколько
необходимо автомобилей для перевозки всех делегатов конференции.
Пример
Входные данные
Результат
6
20
3
4Программа
program z11;
var
N,M,K,x:integer;
Begin
writeln ('Введите количество участников');
readln(N);
writeln ('Введите вместимость первого автомобиля');
readln(K);
writeln ('Введите вместимость второго автомобиля');
readln(M);
x:=0;
while N>0 do
begin
x:=x+1;
if x mod 2<>0 then N:=NK else N:=NM;
end;
writeln (x);
end.
Задача 12
Имеется четыре коробки спичек и в каждой из них по 15 спичек. Номер коробки, из
которой берется очередная спичка, выбирается случайно. Сколько спичек будет сожжено,
прежде чем одна из коробок опустеет? Составить программу.
Программа
program z12;
var
A: array [1..4] of integer;
i, m ,n:integer;
Begin
for i:=1 to 4 doA[i]:=15;
repeat
n:=1+random(4);
A[n]:=A[n]1;
m:=m+1;
until A[n]=0;
writeln ('В коробке', n, 'закончились спички');
writeln ('Израсходовано спичек', m);
end.
Задача 13
Сформировать квадратную матрицу следующего вида.
1
2
3
4
5
2
3
4
5
1
3
4
5
1
2
4
5
1
2
3
5
1
2
3
4
Программа
program z13;
var
A: array [1..5, 1..5] of byte;
i, j:integer;
begin
for i:=1 to 5 do
for j:=1 to 5 do
A[i, j]:=1+(i+j2) mod 5;
for i:=1 to 5 do
begin
for j:=1 to 5 do
write (a[i, j]:2);
writeln;
end;
end.
Задача 14Дано число типа byte. Проверить, является ли палиндромом его двоичное представление с
учетом того, что сохранены старшие нули. Пример таких чисел: 102 (т. к. 102 = 0110 01102, а это
палиндром), 129 (129 = 1000 00012) и т. д.
Пример
Входные данные
Результат
n=129
n=128
Программа
true
false
program z14;
var
n, a, b, c, d: byte;
Begin
readln (n);
a := n mod 2;
n := n div 2;
b := n mod 2;
n := n div 2;
c := n mod 2;
n := n div 2;
d := n mod 2;
n := n div 2;
a := 8 * a + 4 * b + 2 * c + d;
writeln (n = a);
end.
Задача 15
Даны два натуральных числа. Найти их наименьшее общее кратное.
Примечание: наименьшим общим кратным двух чисел m и n называется наименьшее
натуральное число, которое делится на m и n. Обозначение: НОК(m, n)
Пример
Входные данные
Результат
55
m=5
n=11Программа
program z15;
var
m, n, prod: word;
Begin
readln(m, n);
prod := m * n;
while m <> n do begin
if m > n then begin
m := m – n
end
else begin
n := n – m
end
end;
writeln(prod div m)
end.
Задача 16
Дана последовательность символов длины n (n >= 1). Проверить баланс круглых скобок в
этом выражении. Например, при вводе выражения (())() программа должна сообщить о
правильности расстановки скобок, а при вводе выражения ((()) – о неправильности.
Примечание: сбалансированной скобочной записью называется символьное выражение, в
котором каждой открывающей скобке соответствует закрывающая скобка правее и наоборот,
каждой закрывающей скобке соответствует открывающая скобка левее.
Пример
Входные данные
Результат
false
n=7
(((()))
Программа
program Z16;
var
count: integer;
i, n: byte;
c: char;
Begin
readln(n);
count := 0;
for i := 1 to n do beginread(c);
if c = '(' then inc(count);
if c = ')' then dec(count);
if count = 1 then break
end;
writeln(count = 0)
end.
Задача 17
Сколько существует упорядоченных пар натуральных чисел а и b, для которых известны их
наибольший общий делитель d и их наименьшее общее кратное m?
Пример
d=2
m=30
Программа
Входные данные
Результат
(6, 10)
(2, 30)
program Z17;
var
a, b, i, j, d, m:integer;
function nod(a, b:integer):integer;
begin
if a=b then nod:=a
else
if a>b then nod:=nod(ab, b) else nod:=nod(a, ba)
end;
Begin
writeln (‘Введите НОД двух чисел d’);
readln (d);
writeln (‘Введите НОK двух чисел m’);
readln (d);
for i:=1 to 100 do
begin
for j:=1 to 100 do
begin
a:=i;
b:=j;
if ((nod(a, b)=d) and ((a*b div nod(a, b))=m)) then writeln (i, j);
end;
end;
readln
end.Задача 18
Правительство гарантирует, что инфляция в новом году составит р% в месяц. Какого
роста цен за год можно ожидать? Составить программу решения задачи.
Пример
p=1
p=10
Программа
Входные данные
Результат
s=12.68
s=213.84
Пояснения:
Сложные проценты вычисляются по формуле
.
program Z18;
var
a, p, s:real;
Begin
writeln (‘Введите процент месячной инфляции’);
readln (p);
a:=exp(ln(1+p/100)*12);
s:=(a1)*100;
writeln (s:10:2);
readln
end.Задача 19
таковы:
«отличников»,
«хорошистов»,
Факультету выделен стипендиальный фонд в размере f рублей в месяц. Результаты сессии
«троечников». Повышенная стипендия
рублей; задолжники стипендии
рублей, обычная
(для отличников) составляет
лишаются. Составить программу, определяющую сколько студентов каждой категории могут
получать стипендию и каков будет остаток фонда на материальную помощь малоимущим
студентам?
Программа
program Z19;
var
n1,n2,n3,k1,k2,k3,s,s1,s2:integer;
f:longint;
Begin
writeln (‘Введите размер фонда’);
readln (f);
writeln (‘Введите количество отличников, хорошистов и троечников’);
readln (n1,n2,n3);
writeln (‘Введите размер стипендий’);
readln (s1,s2);
if f>s1*n1 then k1:=n1 else k1:=f div s1;
f:=fs1*k1;
if f>s2*n2 then k2:=n2 else k2:=f div s2;
f:=fs2*k2;
if f>s2*n3 then k3:=n3 else k3:=f div s2;
f:=fs2*k3;
writeln ('Количество отличников, получивших стипендию=',k1);
if k2>0 then writeln ('Количество хорошистов, получивших стипендию= ',k2);
if k3>0 then writeln ('Количество троечников, получивших стипендию =',k3);
writeln (‘Фонд материальной помощи=’, f);
readln
end.
Задача 20
N коробок стоят по кругу. В iой коробке j змей. Каждую минуту змеи переползают в
соседнюю коробку (из iой в i+1ую), а из Nой – в первую. Составить программу, определяющую
количество змей в каждой коробке через М минут.
Пример
N=6
M=4
Входные данные
Результат
3 4 5 6 1 2Программа
program Z20;
var
n, m, i, j:integer;
Begin
writeln (‘Введите количество коробок n’);
readln (n);
writeln (‘Введите количество минут m’);
readln (m);
m:=m mod n;
if m=0 then begin j:=0; m:=n end else j:=nm;
for i:=1 to n do
begin
j:=j+1;
write (j,' ');
if i=m then j:=0;
end;
writeln (n);
readln
end.
Задача 21
У Вас имеется в наличии 2000 рублей. Вам необходимо купить в общей сложности 200
предметов по следующим ценам: фломастеры 20 рублей за упаковку, тетради общие 10
рублей за штуку, стержни 1,5 рубля за штуку. Вы должны потратить все деньги.
Программа
program z21;
var
x,y,z,kol:integer;
sum:real;
Begin
for x:=1 to 200 do
begin
for y:=1 to 200 do
begin
for z:=1 to 200 do
begin
sum:=20*x+10*y+1.5*z;
kol:=x+y+z;if (sum=2000) and (kol=200) then writeln('фломастеры ',x,' тетради ', y, ' стержни ', z);
end;
end;
end;
end.
Задача 22
Имеется N точек, расположенных в произвольном порядке на плоскости. Найти
две точки, расстояние между которыми наименьшее.
Входные данные
Результат
Номера точек
1 2
Пример
n=5
3 4
7 2
9 9
7 3
1 1
Программа
program z22;
const n=5;
var
a:array[1..n] of integer;
b:array[1..n] of integer;
i,j,num1,num2:integer;
m,q:real;
begin
FOR i:= 1 TO n do
begin
readln(a[i], b[i]);
end;
num1:=1;
num2:=2;
m:=SQRT(SQR(a[1] a[2])+ SQR(b[1] b[2]));
FOR i:= 1 TO n 1 do
begin
FOR j:= i + 1 TO n do
begin
q:=SQRT(SQR(a[1] a[2])+ SQR(b[1] b[2]));
IF q < m THEN
begin
m:=q;num1:=i;
num2:=j;
end;
end;
end;
writeln(‘Номера точек’);
writeln(num1,' ',num2);
end.
Задача 23
В книге N страниц. Составить программу подсчета количества десятичных цифр,
требуемых для нумерации всех страниц книги. Нумерация проводится от 1 и далее.
Пример
Входные данные
Результат
s=11
s=192
N=10
N=100
Программа
program z23;
var
n, i, s:integer;
k:string;
Begin
readln (n);
s:=0;
for i:=1 to n do
begin
str(i,k);
s:=s+length(k);
end;
writeln ('Количество десятичных цифр=' ,s);
end.
Задача 24
Король Флатландии решил вырубить некоторые деревья, растущие перед его дворцом.
Деревья перед дворцом короля посажены в ряд, всего там растет N деревьев, расстояния между
соседними деревьями одинаковы.
После вырубки перед дворцом должно остаться M деревьев, и расстояния между
соседними деревьями должны быть одинаковыми. Помогите королю выяснить, сколько
существует способов вырубки деревьев.Требуется написать программу, которая по заданным числам N и M определит, сколько
существует способов вырубки некоторых из N деревьев так, чтобы после вырубки осталось M
деревьев и соседние деревья находились на равном расстоянии друг от друга.
Пример
Входные данные
Результат
4
N=5
M=3
Программа
program z24;
var
n, m ,k: longint;
i, d, s: longint;
Begin
readln(n);
readln(m);
s := 0;
k:=(n1) div (m1);
d:=m1;
s:=(2+(k1)*d)*k div 2;
writeln (‘Количество способов вырубки деревьев=’, s);
end.
Задача 25
Из элементов массива А(2n) получить массивы В(n) и C(n) следующим образом. Выбрать
в массиве А два наиболее близких по значению элемента; меньший из них поместить в массив В,
а больший – в массив С. Продолжить выбор из оставшихся элементов до полного заполнения
массивов В и С.
ПримерВходные данные
Массив А
8 0 10 4 1 99 3 15 2 11
Программа
Результат
0 2 4 10 15
Массив В
0
Массив С
1 3 8 11 99
program z25;
var
i, j, x,k,n:integer;
min,d:real;
a:array[1..10] of real;
b:array[1..5] of real;
c:array[1..5] of real;
Begin
x:=0;
k:=0;
for i:=1 to 10 do
read(a[i]);
writeln('Массив А');
for i:=1 to 10 do
write(a[i], ' ');
writeln;
for i:=1 to 10 do
begin
min:=a[i];
for j:=i+1 to 10 do
begin
if a[j]0 then
begin
x:=x+1;
b[x]:=min;
end
else
begin
k:=k+1;
c[k]:=min;
end;
d:=a[n];
a[n]:=a[i];
a[i]:=d;
end;writeln('Массив B');
for i:=1 to 5 do
begin
write(b[i], ' ');
end;
writeln;
writeln('Массив C');
for i:=1 to 5 do
begin
write(c[i], ' ');
end;
end.
Задача 26
Дан прямоугольник, длины сторон которого равны натуральным числам А и В. Составить
программу, которая будет находить на сколько квадратов можно разрезать данный
прямоугольник, если от него каждый раз отрезать квадрат наибольшей площади.
Пример
Входные данные
Результат
7
5
5 * 5 1
2 * 2 2
1 * 1 2
5
Программа
program z26;
var
a,b,k,c:real;
begin
readln(a);
readln(b);
k:=0;
while (a<>0)and (b<>0) do
begin
IF ab) AND (a<>c) AND (a<>d) AND (a<>e) AND (b<>c) AND (b<>d)AND (b<>e) AND
(c<>d) AND (c<>e) AND (d<>e) then
begin
S:=Q[a, 1]+Q[b, 2]+Q[c, 3]+Q[d, 4]+Q[e, 5];
IF S>N THEN
begin
F[1]:=A; F[2]:=B; F[3]:=C; F[4]:=D; F[5]:=E; N:=S;
end;
end;
FOR i:=1 TO 5 do
writeln (P[i], ' номер лавки ', F[i], ' количество денег ', Q[F[i], i]);
writeln (N);
end.