Олимпиадные задач с решениями
на языке
программирования Паскаль
Задача 1
Компьютер в первую секунду печатает на экране 1, во вторую – число 12, в третью – число 23. То есть, в каждую следующую секунду – на 11 больше, чем в предыдущую. В какую секунду впервые появится число, делящееся на 2009?
олимпиады по информатикес решениями.docx
Купенова Гегани Мгеровна
Олимпиадные задач с решениями
на языке
программирования Паскаль
Задача 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
Входные данные
Результат
3 371
Программа
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 do A[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 begin read(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.
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Олимпиада по паскали
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.