олимпиада по паскали

  • Занимательные материалы
  • Контроль знаний
  • Работа в классе
  • docx
  • 10.02.2017
Публикация в СМИ для учителей

Публикация в СМИ для учителей

Бесплатное участие. Свидетельство СМИ сразу.
Мгновенные 10 документов в портфолио.

Олимпиадные задач с решениями на языке программирования Паскаль Задача 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 Входные данные Результат 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:=(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 лет. Входные данные Результат 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:=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               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:=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 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:=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 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+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) Пример Входные данные Результат 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(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 Пояснения:  Сложные   проценты   вычисляются   по   формуле   . 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 Входные данные Результат 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:=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. Задача 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:=(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               Программа Результат 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.