Информатика - решаем задачи

Олимпиадные задачи по программированию с решением

Линейные программы.

Кубики. Кубик с ребром N см покрасили и разрезали на кубики с ребром 1 см. При этом появились такие, у которых окрашено разное количество граней. Например, если N = 3, то после разрезания будет 8 кубиков, у которых окрашено три грани, 12 с двумя гранями, 6 с одной, а один кубик будет совсем неокрашенный. Составьте программу, которая бы определяла, сколько кубиков с каждой возможным количеством окрашенных граней.

Технические условия

Имя программы

CUBES.*

Ввод

С клавиатуры вводится целое число N (от 1 до 1292)

Вывод

На экран или форму выводятся различные варианты окрасок и их количества в формате: количество_окрашеных_граней/количество_кубиков в порядке возрастания первого параметра

 

Пример

Ввод

Вывод

1

3

0/1 1/6 2/12 3/8

Решение на языке Паскаль:
program cubes;
uses crt;
var x,x1,x2,x3,x0,y,z,k,n:integer;
s:string; f,g:text;
begin
assign(f,'cubes.dat');
reset(f);
readln(f,y);
close(f) ;
x3:=8;
x1:=sqr(y-2)*6;
x0:=(sqr(y-2))*(y-2);
x2:=(y-2)*4*2+(y-2)*4;
assign(g,'cubes.sol');
rewrite(g);
writeln(g,'0/',x0,' 1/',x1,' 2/',x2,' 3/',x3);
close(g);
end.

Ветвление

Отрезок. Отрезок на плоскости задается двумя несовпадающие конечными точками A (x1; y1) и B (x2; y2). С точки С (х3; у3) к прямой, содержащей отрезок АВ, проводится перпендикуляр г. Определить, попадает перпендикуляр на отрезок АВ или на его продолжение.
Во входном файле содержится три пары чисел, являющихся координатами точек А, В, С. В файле содержится ответ «На отрезок» или «На продолжение».
Пример входного и выходного файлов

Файл Z1.dat

Файл Z1.rez

3 3
6 2
8 4

На продолжение

Решение на языке Паскаль:
program z3;
var x1,x2,x3,y1,y2,y3,ac,ab,bc,a1,b1:real;f,f1:text;
begin
assign (f, 'z1.dat');
rewrite(f);
readln(x1,y1);
readln(x2,y2);
readln(x3,y3);
writeln(f,x1,y1);
writeln(f,x2,y2);
writeln(f,x3,y3);
close(f);
ac:=sqr(x1-x3)+sqr(y1-y3);
ab:=sqr(x2-x1)+sqr(y2-y1);
bc:=sqr(x3-x2)+sqr(y3-y2);
b1:=(ab+bc-ac)/(2*sqrt(ab*bc));
a1:=(ac+ab-bc)/(2*sqrt(ac*ab));
if (a1 < 0) or (b1 < 0) then
begin
assign(f1, 'z1.rez');
rewrite(f1);
writeln('na prodolzenue');
writeln(f1,'na prodolzenue');close(f1)
end
else
begin
assign(f1, 'z1.rez');
rewrite(f1);
writeln ('na otrezke');
writeln(f1,'na otrezke');
close(f1)
end
end.

Dlina. Дано целое N> 2 и действительные числа a1, b1, ... an, bn. (ai, bi). Рассматривая пары чисел ai и bi, как левые и правые концы отрезков на одной и той же прямой, определить концы отрезка, являющегося пересечением всех этих отрезков. Если такого числа нет, то сообщить об этом. Во входном файле в первой строке задается число N, в следующих N строках - координаты концов отрезков; в файле выводятся координаты концов отрезка, являющегося пересечением всех этих отрезков, или сообщение «Нет пересечения».

Файл DLINA.DAT

Файл DLINA.SOL

3
1 2
3 4
5 6

Нет пересечения

3
1 10
3 7
4 8

47

Решение на языке Паскаль:
program Dlina;
var a,a1,a2,a3,b1,b2,b3,z,n,g,d:integer; f,f1:text; x:string;
begin
assign (f,'dlina.dat');
writeln('vvedite kolvo otrezkov'); readln(a);
writeln('vvedite konci pervogo otrezka'); readln(a1,b1);
writeln('vvedite konci vtorogo otrezka'); readln(a2,b2);
writeln('vvedite konci tretego otrezka'); readln(a3,b3);
rewrite(f);
writeln(f,a);
writeln(f,a1,' ',b1);
writeln(f,a2,' ',b2);
writeln(f,a3,' ',b3);
close(f);
assign (f1,'dlina.sol');
rewrite(f1);
close(f1);
if a2>a3 then z:=a2 else z:=a3;
if a1>z then n:=a1 else n:=z;
writeln('bolshee iz trex',n);
if b2 < b3 then d:=b2 else d:=b3;
if b1 > d then g:=b1 else g:=d;
writeln('menshee iz trex',g);
x:='peresechenia net';
if n < g then
begin
assign(f1,'dlina.sol');
append(f1);
writeln(f1,n,g) ;
close(f1) ;
end
else
begin
assign(f1,'dlina.sol');
append(f1);
writeln(f1,x);
close(f1);
end;
end.

Digit. В положительном целом числе вычеркнуть цифру так, чтобы число, которое осталось, было наибольшим.

 

Входной файл Digit.dat

Выходной файл Digit.sol

Пример 1
Пример 2

321
123

32
23

Решение на языке Паскаль:
program z1;
var x,a,b,c,n:integer; f,f1:text;
begin
write(' vvedite chislo ');
assign (f, 'Digit.dat');
rewrite(f);
readln(x);
writeln(f,x);
close(f);
a:=x div 100;
b:=x mod 100 div 10;
c:=x mod 10;
if (a < b) and (a < c) then N:=10*b+c else if (a > b) and (b < c) then N:=10*a+c else N:=10*a+b;
assign(f1, 'Digit.sol');
rewrite(f1);
writeln('N=',N);
writeln(f1,N);
close(f1)
end.

LESSON. В первом полугодии 2007-08 учебного года занятия проходят с 1 по 8 и с 10 по 17 недели (девятая неделя - каникулы). В расписании одного из классов пять дней в неделю (с понедельника по пятницу) происходит по шесть уроков ежедневно, всего 480 уроков за полугодие. Все эти уроки пронумерованы. Составьте программу, определяющую, на какой неделе и какой день недели проходит урок с данным номером N.

Технические условия

Имя программы

LESSON.*

 

Из входного файла считывается целое число - номер урока N(от 1 до 480). В выходной файл выводятся номер недели и название дня (на украинском, русском или английском языке)

Пример

LESSON.DAT

LESSON.SOL

1

239

Week 8 Friday

2

242

Week 10 Monday

Решение на языке Паскаль:
program LESSON;
var x,a,b:integer; c:string; f,f1:text;
begin
assign (f, 'LESSON.dat');
rewrite(f);
readln(x); writeln(f,x);
close(f);
a:=(x div 30)+1;
if (a >= 9) and (a <= 17) then a:=a+1;
b:=x mod 30;
if ( b >= 1) and (b <= 6 ) then c:=' Monday' else begin
b:=b mod 6;
case b of
1 : c:='Mondey';
2 : c:='Tuesday';
3 : c:='Wednesday';
4 : c:='Trursday';
5 : c:='Friday'
else c:='vixodni';
end;
end;
assign(f1, 'LESSON.sol');
rewrite(f1);
writeln(f1,'week ',a);
writeln(f1,c);
close(f1);
writeln(' a=',a,' b=',b,' c=',c);
end.
Второй вариант
program LESSON;
var f1,f2 : text; i,k,j,l,m,n,a,b,c,d : integer;
begin
assign(f1,'lesson.dat');
reset(f1);
assign(f2,'lesson.sol');
rewrite(f2);
read(f1,n);
k:=n div 6 div 5;
l:=n - k*30 ;
d:=l div 7 + 1 ;
if k=8 then writeln(f2,'week',10) else writeln(f2,'week',k+1);
if d=1 then writeln(f2,'Monday');
if d=2 then writeln(f2,'Tuesday');
if d=3 then writeln(f2,'Wednesday');
if d=4 then writeln(f2,'Thursday');
if d=5 then writeln(f2,'Friday');
close(f1);
close(f2);
end.

Места. В плацкартном вагоне 54 места, которые расположены в девяти купе. Места от 1 до 36 основные и они расположены по четыре в купе (1 - 4 в первом, ..., 33 - 36 в девятом), от 37 до 54 - боковые, разбиты по два, но расположение по купе обратное: места 37, 38 находятся в девятом купе, 39 и 40 в восьмом, ..., 53 и 54 в первом. По номеру места определите номер купе.

Технические условия

Имя программы

VAGON.*

Ввод

С клавиатуры вводится целое число - номер места (от 1 до 54)

Вывод

На экран выводится целое число - номер купе

 

Пример

Ввод

Вывод

1

39

8

Решение на языке Паскаль:
program vagon;
var t:text; s:string; n,r:integer;
begin
assign(t,'vagon.dat');
reset(t);
read(t,s);
close(t);
assign(t,'vagon.sol');
rewrite(t);
val(s,n,r);
if n <= 36 then
if n mod 4 = 0 then write(t,n div 4)
else write(t,n div 4 +1)
else
if n mod 2 = 1 then write(t,9 - (n - 36) div 2)
else write(t,10 - (n - 36) div 2);
close(t);
end.

Второй вариант
program vagon;
uses crt;
var x,y,z,k:integer;f,g:text;
begin
clrscr;
assign(f,'vagon.dat');
reset(f);
readln(f,y);
close(f) ;
if (y>0) and (y <= 54) then begin
if (y>0) and (y <= 36) then x:=(y div 4)+1;
if (y>36) and (y <= 54) then begin
if y mod 2=0 then x:=10-((y-36) div 2) else x:=9-((y-36) div 2) end;
end;
assign(g,'vagon.sol');
rewrite(g);
writeln(g,x);
close(g);
end.

Еще один вариант
program vagon;
var f1,f2:text; n:integer;
begin
assign(f1,'vagon.dat');
assign(f2,'vagon.sol');
reset(f1);
rewrite(f2);
readln(f1,n);
case n of
1..4,53,54:writeln(f2,'1');
5..8,52,51:writeln(f2,'2');
9..12,50,49:writeln(f2,'3');
13..16,48,47:writeln(f2,'4');
17..20,46,45:writeln(f2,'5');
21..24,44,43:writeln(f2,'6');
25..28,42,41:writeln(f2,'7');
29..32,40,39:writeln(f2,'8');
33..36,38,37:writeln(f2,'9');
end;
close(f1);
close(f2);
end.

Кубики. Кубик с ребром N см покрасили и разрезали на кубики с ребром 1 см. При этом появились такие, у которых окрашено разное количество граней. Например, если N = 3, то после разрезания будет 8 кубиков, у которых окрашено три грани, 12 с двумя гранями, 6 с одной, а один кубик будет совсем неокрашенный. Составьте программу, которая бы определяла, сколько кубиков с каждой возможным количеством окрашенных граней.

Технические условия

имя программы

CUBES.*

Ввод

С клавиатуры вводится целое число N (от 1 до 1292)

Вывод

На экран или форму выводятся различные варианты окрасок и их количества в формате: количество_окрашеных_граней/количество_кубиков в порядке возрастания первого параметра

 

Пример

Ввод

Вывод

1

3

0/1 1/6 2/12 3/8

Решение на языке Паскаль:
program cubes;
var n,a,b,c,d:integer; f:text;
begin
assign(f,'cubes.dat');
reset(f);
read(f,n);
close(f);
assign(f,'cubes.sol');
rewrite(f);
if n=1 then write(f,'0/0 1/0 2/0 3/1');
if n=2 then write(f,'0/0 1/0 2/0 3/8');
if n>2 then begin
a:=8;
b:=12*n-24;
c:=6*n*n-3*a-2*b;
d:=n*n*n-a-b-c;
write(f,'0/',d,' ','1/',c,' ','2/',b,' ','3/',a);
end;
close(f);
end.

Второй вариант
uses crt;
var n,i,j,k,m,k0,k1,k2,k3 : longint; f,f1 : text;
begin
clrscr;
assign(f,'CUBES.dat');
reset(f);
assign(f1,'CUBES.sol');
rewrite(f1);
readln(f,n);
k:=n*n*n;
if n=1 then writeln(f1,'6/1') else
if n=2 then writeln(f1,'3/8') else
begin
k2:=12*(n-2);
k3:=8;
k1:=6*(n*n-4-4*(n-2));
k0:=k-k1-k2-k3;
writeln(f1,'0/',k0,' ','1/',k1,' ','2/',k2,' ','3/',k3)
end;
close(f); close(f1);
end.

Еще один вариант
program cubes;
var x1, x2: integer; x3, x4, n : integer; f1, f2 : text;
begin
assign(f1, 'cubes.dat');
assign(f2, 'cubes.sol');
reset(f1);
read(f1, n);
rewrite(f2);
if (n >= 1) and (n <= 1292)
then
begin
x4:= 8;
x3:= (n - 2) * 12;
x2:= ((n - 2) * (n - 2)) * 6;
x1:= (n - 2) * (n - 2) * (n - 2);
end;
if (n > 1)
then writeln(f2, '0/', x1,' 1/', x2,' 2/',x3,' 3/', x4);
if (n = 1) then writeln(f2, '4/1');
close(f1);
close(f2);
end.

Цикли

Задача 1 На интервале [m; n] найти количество натуральных чисел вида 3d5p (d, p - положительные целые числа).
Пример входного и выходного файлов

Файл Z1.dat

Файл Z1.rez

3000 3100

10

Решение на языке Паскаль:
program z1;
var a1,b1,c1,d1,a2,b2,c2,d2,m,n,k,s,x,i:integer;
f,f1:text;
begin
assign (f, 'z1.dat');
rewrite(f);
readln(m,n);
writeln(f,m,n);
close(f);
a1:=m div 1000; b1:=m mod 1000 div 100;
c1:=m mod 100 div 10; d1:=m mod 10;
a2:= n div 1000; b2:=n mod 1000 div 100;
c2:=n mod 100 div 10; d2:=n mod 10;
for i:=1 to 10 do
begin
if b1 < b2 then
begin
k:=k+1;
b1:=b1+1;
end;
if d1 < d2 then
begin
x:=x+1;
d1:=d1+1;
end;
end;
s:=10*k+x;
assign(f1, 'z1.rez');
rewrite(f1);
writeln('s=',s);
writeln(f1,s);
close(f1)
end.

Задача 2. Задана строка, состоящий из цифр и букв. Найти сумму цифр, записанных в строке. В случае, если строка не содержит ни одной цифры, вывести сообщение «Цифр нет».
Пример входного и выходного файлов

Файл Z1.dat

Файл Z1.rez

1авк25ннн

8

Решение на языке Паскаль:
program z1;
var x,r:string;i,s,n,cod:integer;f,f1:text;
begin
assign (f, 'z1.dat');
rewrite(f);
readln(x);
writeln(f,x);
close(f);
for i:=1 to length(x) do
begin
r:=x[i];
val(r,n,cod);
s:=s+n;
end;
if s=0 then
begin
assign(f1, 'z1.rez');
rewrite(f1);
writeln('cipher not');
writeln(f1,'cipher not');
close(f1)
end;
if s>0 then
begin
assign(f1, 'z1.rez');
rewrite(f1);
writeln('s=',s);
writeln(f1,s);
close(f1)
end
end.

REBUS.Составить программу REBUS, которая определяет все 4-значные числа на интервале [M, N], удовлетворяющие условиям:
a) abcd - 4-цифровое число;
b) a, b, c, d - разные цифры;
c) ad - cd = a + b + c + d;
и подсчитывает общее количество этих чисел.
Во входном файле REBUS.DAT в 1-м и 2-й строчках находятся два числа M и N. В файле REBUS.SOL выводятся числа, удовлетворяющие условиям а)-с), и их количество.

файл REBUS.DAT

файл REBUS.SOL

5128
5467

5139
5302
2

Решение на языке Паскаль:
program REBUS;
var a,b,c,d,m,n,k,x,i:integer; f,f1,f2:text;
begin
assign (f,'rebus.dat');
readln(m,n);
rewrite(f);
writeln(f,m);
writeln(f,n);
close(f);
for i:=m to n do
begin
a:=i div 1000; b:=i mod 1000 div 100;
c:=i mod 100 div 10; d:=i mod 10;
if (a <> b) and (a <> c) and (a <> d) and (b <> c) and (b <> d) and (c <> d) and (a*d-c*d=a+b+c+d) then
begin k:=k+1;
assign(f1,'rebus.sol');
append(f1);
writeln(f1,i);
close(f1);
end;
end;
assign(f1,'rebus.sol');
rewrite(f1);
writeln(k);
writeln(f1,k);
close(f1) end.

DATES. Даны две календарные даты. Вычислите количество дней между ними.
Данные вводятся в файл в формате «ДД.ММ.ГГГГ», де ДД – день, ММ – месяц, ГГГГ – год.

Файл DATES.DAT

Файл DATES.SOL

21.01.1996
22.01.1996

1

01.02.1996
01.03.1996

29

Решение на языке Паскаль:
program RUN;
Uses CRT;
Const M:array[0..11] of byte=(31,29,31,30,31,30,31,30,30,31,30,31);
var chiclo1,chiclo2,i,w1,w2,god1,god2, S,S1,S2:integer; f,f1:text;
begin
assign (f,'dates.dat');
writeln(' vvedite pervy daty');
readln(chiclo1,w1,god1);
writeln(' vvedite vtorogy daty');
readln(chiclo2,w2,god2);
rewrite(f);
if (chiclo1 < 10) and (w1 < 10) then writeln(f,'0',chiclo1,'.0',w1,'.',god1);
if (chiclo2 < 10) and (w2 < 10) then writeln(f,'0',chiclo2,'.0',w2,'.',god2);
if (chiclo1 > 10) and (w1 < 10) then writeln(f,chiclo1,'.0',w1,'.',god1);
if (chiclo2 > 10) and (w1 < 10) then writeln(f,chiclo2,'.0',w1,'.',god1);
close(f);
assign (f1,'d:\dates.sol');
rewrite(f1);
close(f1);
S1:=0; S2:=0;
for i:=0 to w1-2 do begin S1:=S1+M[i];
writeln('S1=',S1);
end;
S1:=S1+chiclo1; writeln('S1+ dni=',S1);
for i:=0 to w2-2 do begin S2:=S2+M[i];
writeln('S2=',S2);
end;
S2:=S2+chiclo2; writeln('S2 +dni=',S2) ;
S:=S2-S1;
writeln('raznica dney=',s);
assign(f1,'dates.sol');
append(f1);
writeln(f1,s);
close(f1);
end.

DATES. Стрелки часов движутся с постоянными угловыми скоростями и показывают h часов m минут. Найти число полных минут до того времени, когда стрелки совпадут.
Данные вводятся из файла DATES.DAT в формате "hm". В файл DATES.SOL выводится количество полных минут.

 

DATES.DAT

DATES. SOL

Пример 1
Пример 2

0 0
1 1

0
5

Решение на языке Паскаль:
program OLIMP;
var CHAS,MIN,i:integer; CHAS1,MIN1:real; f,f1:text;
begin
assign (f,'DATES.DAT');
rewrite(f);
write(' vvedite vrema ');
readln(CHAS,MIN);
writeln(f,CHAS:3,MIN:3);
close(f);
i:=0;
CHAS1:=CHAS*30;
MIN1:=MIN*6;
while CHAS1>MIN1 do
begin
CHAS1:=CHAS1+0.5;
MIN1:=MIN1+6;
i:=i+1;
end;
assign(f1, 'DATES.SOL');
rewrite(f1);
writeln(' proshlo ',i,' minyt ');
writeln(f1,i);
close(f1)
end.

Lift. Чтобы поднять на N-й этаж M-этажного дома новый холодильник, Витя вызвал бригаду грузчиков. Оплата работы грузчиков рассчитывается так: за подъем холодильника на один этаж требуется заплатить 200 гривен, за спуск на один этаж - 100 гривен. За подъем и спуск на лифте плата не взимается. Несмотря на то, что в доме есть лифт, Вите возможно все же придется заплатить грузчикам, поскольку лифт останавливается только на каждом K-м этаже, начиная с первого (то есть на этажах с номерами 1, K +1, 2K +1, 3K +1, ...). Нужно вычислить, какой минимальной суммы денег достаточно, чтобы грузчики доставили холодильник с первого этажа на N-й.
Во входном файле записаны три числа: M (2 <= M <= 100), N (2 <= N <= M) и K (2 <= K <= M-1), разделенные пробелами.
В выходной файл выведите одно число - минимальную стоимость подъема холодильника.

 

Файл Lift.dat

Файл Lift.sol

Пример 1

20 7 4

200

Пример 2

20 7 2

0

Решение на языке Паскаль:
program Lift;
var A,B,N,K,M,c,i:integer; W:array[1..20] of integer; f,f1:text;
begin
assign (f, 'Lift.dat');
rewrite(f);
write(' vvedite kol-vo etazhey M='); readln(M);
write(' vvedite etazh dostavki N='); readln(N);
write(' vvedite shag ostanovki lifta K='); readln(K);
writeln(f,M:3,N:3,K:3);
close(f);
i:=1;
repeat
W[i]:=(i-1)*k+1; c:=i;
i:=i+1;
until W[i-1]>M ; { c - chetchik ostanovok);}
For i:=1 to c do begin
if (W[i] < N) and(N < W[i+1]) then
begin A:=(N-W[i])*200;
B:=(W[i+1]-N)*100;
if A>B then begin
assign(f1, 'Lift.sol');
rewrite(f1);
writeln(' opyckaemca B=',B);
writeln(f1,B);
close(f1)
end
else begin
assign(f1, 'Lift.sol');
rewrite(f1);
writeln(' podnimaemca A=',A);
writeln(f1,A);
close(f1)
end;
end;
if W[i]=N then begin
assign(f1, 'Lift.sol');
rewrite(f1);
writeln('nichego ne platim');
writeln(f1,'nichego ne platim');
close(f1)
end;
end;
end.

«Несчастливые пиковые» числа. Трехзначное число назовем «пиковым», если его цифра десятков будет больше цифры единиц и сотен (напр., число 276 - «пиковое», а 954 и 277 - нет). Составьте программу, которая подсчитывает, сколько «пиковых» чисел находится на отрезке [A, B] и сколько из них делятся без остатка на 13.

Технические условия

Имя программы

PICK.*

Ввод

два целых числа 100 <= Aі <= Bі <= 999

Вывод

В текстовый файл PICK.SOL выводится количество «пиковых» чисел и тех из них, которые делятся без остатка на 13

 

Пример

PICK.DAT

PICK.SOL

объяснение

1

135 145

4 1

В первом тесте на промежутке 135-145 находится 4 пиковых числа: 140, 141, 142, 143 и 143 делится без остатка на 13, во втором тесте числа 120 и 121 на 13 не делятся

Решение на языке Паскаль:
program PICK;
var x,a,b,n,k,m,c,t:integer; f,f1:text;
begin
write(' vvedite 2 chisla cheres probel ');
assign (f, 'PICK.DAT');
rewrite(f);
readln(A,B); writeln(f,A,' ',B);
close(f);
for x:=a to B do
begin
n:=x Div 100;
k:=x mod 100 div 10;
m:=x mod 10;
if (K>n) and (k>m) then c:=c+1;
if x mod 13=0 then t:=t+1;
end;
assign(f1, 'PICK.SOL');
rewrite(f1);
writeln(f1,c,' ',t);
close(f1);
writeln(' a=',a,' b=',b,' c=',c,' t=',t);
end.

Второй вариант
Program PICK;
var f1,f2 : text; a,b,c,d,i,j,k,l,n,x,y,z : integer;
begin
assign(f1,'pick.dat');
reset(f1);
assign(f2,'pick.sol');
rewrite(f2);
readln(f1,l);
for d:= 1 to l do begin
read(f1,a,b);
k:=0;
J:=0;
for i:= a to b do begin
z:=i mod 10;
y:=i div 10 mod 10;
x:=i div 100;
if (y>x) and (y>z) then k:=k+1 ;
if (y>x) and (y>z) and (i mod 13 =0)
then j:=j+1 ;
end;
write(f2,k,' ',j);
end;
close(f1);
close(f2);
end.

Добавление. Число, которое одинаково читается слева направо и наоборот, называется палиндромом, напр., 3773. Возьмем произвольное число N (от 10 до 10000). Если оно не палиндром, добавим к нему число, состоящее из тех же цифр, но записанных в обратном порядке. Будем повторять эту операцию, пока не получим палиндром (если это возможно). Например, N = 49, 49 +94 = 143, 143 +341 = 484. Напишите программу, которая бы определяла, можно из заданного числа N получить палиндром, и если возможно, то за какое минимальное количество добавлений. Если меньше, чем за 100 добавлений это сделать невозможно, вывести на экран -1.

Технические условия

Имя программы

ADDS.*

Ввод

С клавиатуры вводится целое число N (від 10 до 10000)

Вывод

На экран или форму выводится минимальное количество добавлений для получения палиндрома или -1, если за 100 добавлений это сделать невозможно

 

Пример

Ввод

Вывод

1

3773

0

2

49

2

Решение на языке Паскаль:
Var f1,f2:text; d1,d,n,b:string; j,i,k,s,x,y,cod:integer;
begin
assign(f1,'adds.dat');
assign(f2,'adds.sol');
reset(f1);
rewrite(f2);
readln(f1,n);
b:='';
d1:='';
for i:=length(n) downto 1 do b:=b+n[i];
if n=b then writeln (f2,'0')
else begin
k:=0;
repeat
val(b,x,cod);
val(n,y,cod);
s:=x+y;
k:=k+1;
str(s,d);
for j:=length(d) downto 1 do
d1:=d1+d[j];
b:=d1;
n:=d;
until (d1=d) or (k < 100);
end;
if (k < 100) then writeln(f2,k+1)
else writeln(f2,'-1');
close(f1);
close(f2);
end.

Второй вариант
program adds;
var a,i,b,c,p:integer ; f,f1,t:text; cod:integer;
s,s1,d:string; ki,k:integer;
begin
assign(f,'adds.dat');
reset(f);
read(f,s);
k:=1;
for i:=0 to length(s)+1 do
d[i+1]:=s[length(s)-i] ;
for i:=1 to length(s) do d:=d+d[i];
assign(f1,'adds.sol');
rewrite(f1);
if s <> d then writeln(f1,2) else writeln(f1,0);
close(f);
close(f1);
end.

Массивы

Hacker. Департамент финансовой поддержки малоимущих использует в своей работе три электронных списки: всех студентов, список всех школьников и список всех учителей. Понятно, что нельзя присутствовать во всех трех списках одновременно. Однако, компьютерный взломщик - хакер проник во все списки и незаконно получает деньги в тройном размере. Объемы списков настолько огромны, что без помощи компьютерной программы хакера не поймать. Составьте программу ХАКЕР, что: 1. Вводит списки людей из текстовых файлов STUDENT.DAT, PUPILS.DAT, TEACHER.DAT;
Находит человека, который присутствует во всех трех списках;
Выводит результат в текстовый файл HACKER.SOL.
В исходных файлах информация располагается следующим образом: каждая строка содержит последовательность из 10 цифр - код социального страхования одного человека; этот код однозначно описывает будб - любого гражданина страны, в том числе и хакера; в каждом файле последовательность кодов упорядоченная по возрастанию. Единственная строка выходного файла должно содержать код хакера.

STUDENT.DAT

PUPILS.DAT

TEACHER.DAT

HACKER.SOL

00000000001

0000000005

00000000021

1000000001

10000000001

0000000007

00000000031

 

20000000002

1000000001

10000000001

 

30000000003

 

10000000091

 

 

 

50000000051

 

Решение на языке Паскаль:
program HACKER;
const n=1000 ;
var ST,PUP,HAC,TEA:array[1..n] of string[10];
j,s, i,k,q,w,e:integer;
f,f1,f2,f3:text; x:string;
begin
assign (f,'students.dat');
rewrite(f);
close(f);
assign (f1,'pupils.dat');
rewrite(f1);
close(f1);
assign (f2,'teashers.dat');
rewrite(f2);
close(f2);
assign (f3,'hacker.sol');
rewrite(f3);
close(f3);
writeln('vvedite kol students'); readln(q);
writeln('vvedite kod students');
for i:=1 to q do readln( ST[i]);
writeln('vvedite kol pupils'); readln(w);
writeln('vvedite kod pupils');
for i:=1 to w do readln( PUP[i]);
writeln('vvedite kol teasher'); readln(e);
writeln('vvedite kod teasher');
for i:=1 to e do readln( TEA[i]);
for i:=1 to q do begin
writeln('ST(',i,')=',ST[i]);
assign (f,'students.dat');
append(f);
writeln(f,ST[i]);
close(f);
end;
for i:=1 to w do begin
writeln('PUP(',i,')=',PUP[i]);
assign (f1,'pupils.dat');
append(f1);
writeln(f1,PUP[i]);
close(f1);
end;
for i:=1 to e do begin
writeln('TEA(',i,')=',TEA[i]);
assign (f2,'teashers.dat');
append(f2);
writeln(f2,TEA[i]);
close(f2);
end;
for i:=1 to q do
begin x:=ST[i];
for j:=1 to w do
for s:=1 to e do
if (x=PUP[j]) and (x=TEA[s]) then
begin
k:=k+1;
HAC[k]:=x;
end;
end;
for i:=1 to k do
begin
writeln (HAC[i]);
assign (f3,'hacker.sol');
append(f3);
writeln(f3,HAC[i]);
close(f3);
end;
end.

Sport. В беге участвуют N спортсменов. Результаты забегов занесены в массив по порядку номеров участников. Определить время (результат) бронзового призера.
Программа должна читать данные из текстового файла RUN.DAT следующего формата:
1-я строка содержит количество участников забега;
Следующие строки содержат время каждого участника забега (по одному в каждой строке) в последовательности номеров участников.
Результат работы программы содержится в файле RUN.SOL.

Файл RUN.DAT

Файл RUN.SOL

5
25
19
22
17
18

2

Решение на языке Паскаль:
program sport;
const n=5;
var d ,a:array[1..n] of integer;j,c,x ,i:integer; f,f1:text;
begin
assign (f,'RUN.dat');
rewrite(f);
close(f);
assign (f1,'RUN.sol');
rewrite(f1);
close(f1);
writeln ('vvedite kolichestvo sportcmenov a potom rezyltat');
for i:=0 to n do readln(d[i]);
for i:=0 to n do begin
writeln(d[i]);
assign (f,'d:\run.dat');
append(f);
writeln(f,d[i]);
close(f);
end;
for i:=0 to n do a[i]:=d[i];
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then
begin
c:=a[i];
a[i]:=a[j];
a[j]:=c
end;
x:=a[3];
for i:=1 to n do if d[i]=x then begin
writeln ('dorozka',i);
assign (f1,'RUN.sol');
append(f1);
writeln(f1,i);
close(f1);
end;
end.

TAB. Заполнить прямоугольную таблицу размерности NxM (M> N) вложенными рамками, каждая из которых изображается числом, равным разности между N и номером рамки. Внешнюю рамку считать первым. Пример для N = 5, M = 8:

4

4

4

4

4

4

4

4

4

3

3

3

3

3

3

4

4

3

2

2

2

2

3

4

4

3

3

3

3

3

3

4

4

4

4

4

4

4

4

4

Во входном файле в первой строке вводятся числа N и M. В файле выводится прямоугольная таблица.

Файл Z.dat

Файл Z.rez

3 3

2 2 2
2 1 2
2 2 2

Решение на языке Паскаль:
program tab;
var m, n, i, j, k:integer; a :array[1..100, 1..100] of integer;
begin
Write( 'M= '); Readln(m);
Write( 'N= '); Readln(n);
for k:= 1 to ((n-1) div 2)+1 do
for j:= k to n-k+1 do
for i:= k to m-k+1 do
a[i,j]:= n-k;
for j:=1 to n do
begin
for i:= 1 to m do
Write(a[i,j] :3);
Writeln(' ');
end;
end.

Виза. Жители одного государства очень любят различные математические головоломки. Даже тот, кто желает получить въездную визу, должен решить задачу: отыскать ключевое слово. Условие задачи таковы: На листке написано несколько длинных чисел. Если сложить все цифры в каждом числе, выйдут новые числа. Далее следует сложить все цифры в каждом из вновь полученных чисел. Процесс надо продолжать до тех пор, пока в результате не останутся числа меньше 10. После этого все просто: числа от 0 до 9 - это номера букв в алфавите (в этом государстве алфавит состоит всего из десяти букв). Замена чисел буквами и дает ключевое слово. Напишите программу, которая будет отыскивать ключевое слово.

Имя программы

VIZA.*

Пример

VIZA.DAT

VIZA.SOL

объяснение

1

АГЕИКЛМОРТ
4
8267
19929
54262
000000000000

ЛИГА

Во входном файле:
Первая строка - алфавит государства: десять букв, расположенных по возрастанию порядковых номеров без пробелов.
Вторая строка - количество чисел (N <= 255)
Следующие N строк - именно начальные числа (по одному в строке, в каждом не более 255 цифр).
Формат выходного файла:
Ключевое слово

Решение на языке Паскаль:
PROGRAM VISA;
var n, a,d,i,sum,r:longint;
k : Array[0..11] of longint ;
c: array[1..255] of longint;
kod: array[1..255] of longint;
alf:string;
f,f1:text;
begin
assign(f,'visa.dat');
reset(f);
read(f,alf);
readln(f,n);
for i:=1 to n do readln(f,k[i]);
i:=1;
d:=1;
for i:=1 to n do begin
repeat
sum:=0 ;
while k[i] div 10 <> 0 do begin
if d>1 then
k[i]:= k[i] div 10;
d:=d+1;
c[i] := k[i] mod 10;
sum:=sum+c[i];
end;
k[i]:=sum;
d:=1;
until sum < 9;
kod[i]:= sum;
end;
FOR I:=1 TO N DO KOD[I]:=KOD[I]+1;
ASSIGN(f1,'visa.sol');
rewrite(f1);
for i:=1 to n do write(F1,alf[kod[i]]);
close(f);
close(f1);
end.

Второй вариант
program VIZA;
label 1;
var w, x,r:string;i,j,s,s1,n,cod,count:integer;f,f1:text; alf:array[0..9] of string[10];
begin
assign (f, 'VIZA.dat');
rewrite(f);
close(f);
assign (f1, 'VIZA.rez');
rewrite(f1);
close(f1);
write('vvedite kol-vo chifr');
readln(count);
alf[0]:='A';
alf[1]:='G';
alf[2]:='E';
alf[3]:='I';
alf[4]:='K';
alf[5]:='L';
alf[6]:='M';
alf[7]:='O';
alf[8]:='P';
alf[9]:='T';
for i:=0 to 9 do begin
assign(f,'VIZA.DAT');append(f);
write(f,alf[i]);
close(f);
end;
for i:=1 to count do begin
write(' vvedite chislo');
readln(x);
1: S:=0;
for J:=1 to length(x) do
begin
r:=x[j];
val(r,n,cod);
s:=s+n;
write(' s=',s) ;
end;
if s>9 then begin str(s,x); goto 1 end;
write(' ', alf[s]);
assign(f1, 'VIZA.rez');
append(f1);
writeln(f1,alf[s]);
close(f1)
end;
end.

Лайнеры. 5 декабря 2009 в порту P собралось N круизных лайнеров, совершающих регулярные рейсы и возвращаются к этому порту через ti дней. Какого числа они первый раз снова появятся вместе в этом порту?

Технические условия

Имя программы

SHIPS.*

Ввод

С клавиатуры вводится количество лайнеров N - целое число от 2 до 10. А затем N целых чисел - периоды их рейсов в днях (целые числа от 1 до 30).

Вывод

На экран или форму выводится дата их возвращения в формате DD/MM/YYYY. Гарантируется, что эта дата не превышает 31/12/2012

 

Пример

Ввод

Вывод

1

3
6 4 8

29/12/2009

Решение на языке Паскаль:
var n, mm :byte; i, i2, flag, j, year, dd :integer;
t :array [1..30] of byte;
begin
year := 2009;
readln(n);
j := 1;
for i := 1 to n do begin
read(t[i]);
j := j * t[i]
end;
for i := 1 to j do begin
flag := 0;
for i2 := 1 to n do if (i mod t[i2] = 0) then flag := flag + 1;
if flag = n then begin
dd := 5;
mm := 12;
for i2 := 1 to i do begin
dd := dd + 1;
if (((mm = 2) and (dd = 29) and (year = 2012)) or ((mm = 2) and (dd = 28) and (year < 2012)))
or (((mm = 4) or (mm = 6) or (mm = 9) or (mm = 11)) and (dd = 30)) or (dd = 31) then begin
dd := 0;
mm := mm + 1;
end;
if (mm = 13) and (dd = 1) then begin
mm := 1;
year := year + 1;
end;
end;
writeln(dd,'/',mm,'/',year);
i := j;
end;
end;
end.

Морской бой. Полем для игры «Морской бой» является квадрат 10х10 ячеек. Столбцы обозначаются заглавными латинскими буквами от A до J слева направо, а строки цифрами от 0 до 9 снизу вверх. На этом поле первый игрок тайно размещает один корабль размером 1х4 ячейки, два - 1х3, три 1х2 и четыре корабля из одной ячейки, которые размещаются в одном столбце или одной строке каждый, притом ячейки различных кораблей не являются соседями по горизонтали, вертикали или диагонали. Второй игрок называет последовательность полей обстрела, напр., A7 C0 J4, а первый игрок извещает их результативность: B (мимо корабли) W (корабль ранен) K (корабль погиб, потому выстрелы попали во все ячейки данного корабля). Составьте программу, которая бы самостоятельно выдавала сообщение первого игрока.

Технические условия

Имя программы

SEAWAR.*

Ввод

В 10 строках файла SEAWAR.DAT описывается позиция кораблей первого игрока сверху вниз по 10 символов в строке: точек «.» Для пустых ячеек и больших латинских букв «Х» - наличие корабля. В 11 строке количество выстрелов N (от 5 до 15) и направления их ударов.

Вывод

В файл SEAWAR.SOL выводится строка из N латинских букв B, W или K

 

Пример

SEAWAR.DAT

SEAWAR.SOL

 

ХХХХ......
........XX
X.X.X.....
.......X..
.XX....X..
.......X..
..........
...X.....X
.........X
.XX......X
7 D1 D2 D3 H4 H5 H3 H6

BKBWWBK

Решение на языке Паскаль:
uses crt;
var a,b,c,d,n,j,i,k,p : integer;
s1,s2:array [0..99] of string;
q,q1:array [1..100] of integer;
f1,f2 : text;
s:string;
begin
clrscr;
assign(f1,'SEAWAR1.dat');
reset(f1);
assign(f2,'seawar1.sol');
rewrite(f2);
for i:=1 to 10 do
readln(f1,s1[i]);
read(f1,n);
for i:=1 to n do read(f1,s);
K:=1;
for i:=1 to n*3 do begin
if s[i] = 'A' then begin q[k]:=1; k:=k+1; end;
if s[i] = 'B' then begin q[k]:=2; k:=k+1; end;
if s[i] = 'C' then begin q[k]:=3; k:=k+1; end;
if s[i] = 'D' then begin q[k]:=4; k:=k+1; end;
if s[i] = 'E' then begin q[k]:=5; k:=k+1; end;
if s[i] = 'F' then begin q[k]:=6; k:=k+1; end;
if s[i] = 'G' then begin q[k]:=7; k:=k+1; end;
if s[i] = 'H' then begin q[k]:=8; k:=k+1; end;
if s[i] = 'I' then begin q[k]:=9; k:=k+1; end;
if s[i] = 'J' then begin q[k]:=10; k:=k+1; end;
end;
j:=0;
for i:=1 to n*3 do begin
i:=i+2;
j:=j+1;
val(s[i],q1[j],p);
end;
for i:=0 to 11 do begin
s1[0][i]:='.';
s1[i][0]:='.';
s1[i][11]:='.';
s1[11][i]:='.';
end;
for i:=1 to n do begin
if s1[10-q1[i]][q[i]] = '.' then write(f2,'B');
if s1[10-q1[i]][q[i]] = 'X' then {write(f2,'W');}
if (s1[9-q1[i]][q[i]] = '.')
and (s1[11-q1[i]][q[i]]='.')
and (s1[10-q1[i]][q[i]-1]='.')
and (s1[10-q1[i]][q[i]+1]='.')
and (s1[9-q1[i]][q[i]-1]='.')
and (s1[9-q1[i]][q[i]+1]='.')
and (s1[11-q1[i]][q[i]-1]='.')
and (s1[11-q1[i]][q[i]+1]='.')
then begin write(f2,'K'); s1[10-q1[i]][q[i]] := '.'; end
else begin write(f2,'W'); s1[10-q1[i]][q[i]] := '.'; end;
end;
close(f1);
close(f2);
end.