Сборник задач с решениями на языке программирования Паскаль

advertisement
Сборник
задач с решениями
на языке
программирования Паскаль
Подготовила: Алдошина Е.А.,
учитель информатики
МБОУ СОШ №18
г. Узловая
Тульской области
Задача 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
371
Программа
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
0
Задача 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:=(x3-x1)/(y3-y1);
n:=(x3-x2)/(y3-y2);
if (z=n) and (z=(x2-x1)/(y2-y1)) then
writeln ('Точки лежат на одной прямой’)
else
writeln ('Точки не лежат на одной прямой’);
end.
Задача 4
Сообщество роботов живет по следующим законам: один раз в год они объединяются в
полностью укомплектованные группы по 3 или 5 роботов (причем число групп из 3 роботов максимально возможное). За год группа из 3 роботов собирает 5, а группа из 5 - 9 новых
собратьев. Каждый робот живет 3 года после сборки. Известно начальное количество
роботов (К>7), все они только что собраны. Определить, сколько роботов будет через N лет.
Пример
Входные данные
8
3
10 10
Результат
152
143702
Программа
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:=x-3; y:=2 end
else begin x:=x-1; 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
if (x<=y) and (x<=z) then kol:=int(x/r);
if (y<x) and (y<=z) then kol:=int(y/r);
if (z<x) and (z<y) then kol:=int(z/r);
end;
writeln (kol);
end.
Задача 6
Предприниматель, начав дело, взял кредит размером k рублей под p процентов годовых и
вложил его в свое дело. По прогнозам, его дело должно давать прибыль r рублей в год. Сможет
ли он накопить сумму, достаточную для погашения кредита, и если да, то через сколько лет?
Программа
program z6;
var
k,p,r,s, h:real;
kol: integer;
Begin
readln (k,p,r);
kol:=0;
while (k>0) and (kol<50) do
begin
kol:=kol+1;
k:=k+k*(p/100);
k:=k-r;
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<s do
begin
k:=k+k*(p/100);
n:=n+1;
end;
writeln ('Количество лет -',int(n/12));
end.
Задача 10
Число Цукермана – натуральное число, которое делится на произведение своих цифр,
например: 175 делится на 1·7·5=35. Составить программу, которая выводит на экран все
трехзначные числа Цукермана.
Программа
program z10;
var i,a,b,c: integer;
Begin
for i := 111 to 999 do
begin
a := i div 100;
b := (i div 10) mod 10;
c := i mod 10;
if (b <> 0) and (c <> 0) and (i mod (a * b * c) = 0) then writeln (i);
end;
end.
Задача 11
На конференцию приехало N
человек. Для их перевоза выделили автомобили
вместимостью К и М человек (без водителя). К гостинице автомобили подаются в таком
порядке: сначала вместимостью К человек, потом – М человек и так далее. В автомобиле можно
перевозить не более максимально допустимого количества пассажиров. Определить, сколько
необходимо автомобилей для перевозки всех делегатов конференции.
Пример
Входные данные
20
3
4
Результат
6
Программа
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:=N-K else N:=N-M;
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+j-2) 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)
Пример
Входные данные
m=5
n=11
Результат
55
Программа
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). Проверить баланс круглых скобок в
этом выражении. Например, при вводе выражения (())() программа должна сообщить о
правильности расстановки скобок, а при вводе выражения ((()) – о неправильности.
Примечание: сбалансированной скобочной записью называется символьное выражение, в
котором каждой открывающей скобке соответствует закрывающая скобка правее и наоборот,
каждой закрывающей скобке соответствует открывающая скобка левее.
Пример
Входные данные
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.
Результат
false
Задача 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(a-b, b) else nod:=nod(a, b-a)
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
Программа
Пояснения:
𝑝
12
Сложные проценты вычисляются по формуле [(1 + 100)
− 1] ∙ 100%.
program Z18;
var
a, p, s:real;
Begin
writeln (‘Введите процент месячной инфляции’);
readln (p);
a:=exp(ln(1+p/100)*12);
s:=(a-1)*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:=f-s1*k1;
if f>s2*n2 then k2:=n2 else k2:=f div s2;
f:=f-s2*k2;
if f>s2*n3 then k3:=n3 else k3:=f div s2;
f:=f-s2*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
Программа
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:=n-m;
for i:=1 to n do
begin
j:=j+1;
write (j,' ');
if i=m then j:=0;
end;
writeln (n);
readln
end.
Результат
3 4 5 6 1 2
Задача 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 точек, расположенных в произвольном порядке на плоскости. Найти
две точки, расстояние между которыми наименьшее.
Пример
Входные данные
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;
Результат
Номера точек
1 2
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 и далее.
Пример
Входные данные
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);
Результат
s=11
s=192
end;
writeln ('Количество десятичных цифр=' ,s);
end.
Задача 24
Король Флатландии решил вырубить некоторые деревья, растущие перед его дворцом.
Деревья перед дворцом короля посажены в ряд, всего там растет N деревьев, расстояния между
соседними деревьями одинаковы.
После вырубки перед дворцом должно остаться M деревьев, и расстояния между
соседними деревьями должны быть одинаковыми. Помогите королю выяснить, сколько
существует способов вырубки деревьев.
Требуется написать программу, которая по заданным числам N и M определит, сколько
существует способов вырубки некоторых из N деревьев так, чтобы после вырубки осталось M
деревьев и соседние деревья находились на равном расстоянии друг от друга.
Пример
Входные данные
N=5
M=3
Результат
4
Программа
program z24;
var
n, m ,k: longint;
i, d, s: longint;
Begin
readln(n);
readln(m);
s := 0;
k:=(n-1) div (m-1);
d:=m-1;
s:=(2+(k-1)*d)*k div 2;
writeln (‘Количество способов вырубки деревьев=’, s);
end.
Задача 25
Из элементов массива А(2n) получить массивы В(n) и C(n) следующим образом.
Выбрать в массиве А два наиболее близких по значению элемента; меньший из них поместить в
массив В, а больший – в массив С. Продолжить выбор из оставшихся элементов до полного
заполнения массивов В и С.
Пример
Входные данные
Массив А
8 0 10 4 1 99 3 15 2 11
Программа
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]<min then
begin
min:=a[j];
n:=j;
end;
end;
if i mod 2<>0 then
begin
x:=x+1;
b[x]:=min;
end
else
begin
k:=k+1;
Результат
0
Массив В
0 2 4 10 15
Массив С
1 3 8 11 99
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 a<b THEN
begin
c:=int(b/a);
writeln(a, ' * ', a, ' - ', c);
b:=b-c*a
end
ELSE
begin
c:=INT(a/b);
writeln(b, ' * ', b, ' - ', c);
a:=a-c*b;
end;
k:=k+c;
end;
writeln('Количество квадратов-',k);
end.
Задача 27
Папа Карло, играя на шарманке, ежедневно зарабатывает у туристов 5 золотых (монет).
Весь заработок уходит на обед папы Карло и его друзей в харчевне «Три пескаря», где плату
принимают только деревянными (монетами). В меняльных лавках папу Карло не обслуживают.
Банкир Карабас-Барабас для друзей папы Карло установил индивидуальные правила обмена
золотых на деревянные в разных лавках (смотри таблицу). Каждый из друзей может обменять
только один золотой и в каждой лавке могут обслужить только одного из друзей.
Таблица обмена одного золотого на деревянные
№ лавки
Буратино
Мальвина
Пьеро
Арлекино
Артемон
1
12
13
10
7
8
2
10
11
9
7
9
3
11
10
9
8
4
4
10
11
8
10
5
5
7
12
10
9
7
Составить программу нахождения оптимального плана обмена 5 золотых на деревянные в
виде: Буратино, N лавки; Мальвина, N лавки; Пьеро, N лавки; Арлекино, N лавки; Артемон, N
лавки; количество полученных деревянных.
5
В программе рассматривается C20
=120 возможных вариантов обмена золотых монет на
деревянные и выбирается оптимальный вариант обмена.
Программа
program z27;
var
Q:array[1..5,1..5]of integer;
F:array[1..5] of integer;
P:array[1..5] of string;
a,b,c,d,e,N,i,S:integer;
Begin
N:=0;
Q[1, 1]:=12; Q[1, 2]:=13; Q[1, 3]:=10; Q[1, 4]:=7; Q[1, 5]:=8;
Q[2, 1]:=10; Q[2, 2]:=11; Q[2, 3]:=9; Q[2, 4]:=7; Q[2, 5]:=9;
Q[3, 1]:=11; Q[3, 2]:=10; Q[3, 3]:=9; Q[3, 4]:=8; Q[3, 5]:=4;
Q[4, 1]:=10; Q[4, 2]:=11; Q[4, 3]:=8; Q[4, 4]:=10; Q[4, 5]:=5;
Q[5, 1]:=7; Q[5, 2]:=12; Q[5, 3]:=10; Q[5, 4]:=9; Q[5, 5]:=7;
P[1]:='Буратино'; P[2]:='Мальвина'; P[3]:='Пьеро';
P[4]:='Арлекино'; P[5]:='Артемон';
FOR a:=1 TO 5 do
FOR b:=1 TO 5 do
FOR c:=1 TO 5 do
FOR d:=1 TO 5 do
FOR e:=1 TO 5 do
if (a<>b) 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.
Download