Сборник задач с решениями на языке программирования Паскаль Подготовила: Алдошина Е.А., учитель информатики МБОУ СОШ №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.