Статистика
Форма входа
Полезные ссылки
Учебный центр, e-mail:
l3-inf0@yandex.ru
Слушать Радио Дача онлайн
Архив записей
Линейные программы.
Кубики. Кубик с ребром 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 |
На продолжение |
Решение на языке Паскаль:
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 |
Нет пересечения |
3 |
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 |
321 |
32 |
Решение на языке Паскаль:
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 |
5139 |
Решение на языке Паскаль:
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 |
1 |
01.02.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 |
0 0 |
0 |
Решение на языке Паскаль:
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 |
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 |
Решение на языке Паскаль:
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 |
АГЕИКЛМОРТ |
ЛИГА |
Во входном файле: |
Решение на языке Паскаль:
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 |
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 |
|
ХХХХ...... |
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.