type data = record number : 1..31; month : 1..12; year : 1901..1997 end;
var d:array[1..nn] of data; i,n,k:integer; s,s1,s2,s3:string; begin Write('Количество дат (1..50)-> '); Read(n); Writeln('Введите через пробел день, месяц, год: '); for i:=1 to n do Read(d[i].number,d[i].month,d[i].year); { a } Write('Самый ранний из годов: '); k:=d[1].year; for i:=2 to n do if d[i].year<k then k:=d[i].year; Writeln(k); { б } Writeln('Все весенние даты'); for i:=1 to n do if d[i].month in [3..5] then Write(d[i].number,'.',d[i].month,'.',d[i].year,' '); Writeln; { в } Write('Cамая поздняя дата: '); Str(d[1].year,s1); Str(d[1].month,s2); Str(d[1].number,s3); if Length(s2)=1 then s2:='0'+s2; if Length(s3)=1 then s3:='0'+s3; s:=s1+s2+s3; for i:=2 to n do begin Str(d[i].year,s1); Str(d[i].month,s2); Str(d[i].number,s3); if Length(s2)=1 then s2:='0'+s2; if Length(s3)=1 then s3:='0'+s3; if s<s1+s2+s3 then s:=s1+s2+s3 end; Writeln(Copy(s,7,2)+'.'+Copy(s,5,2)+'.'+Copy(s,1,4)) end.
Тестовое решение: Количество дат (1..50)-> 6 Введите через пробел день, месяц, год: 18 4 1950 16 5 1968 5 8 1970 3 9 1968 11 6 1964 16 12 1967 Самый ранний из годов: 1950 Все весенние даты 18.4.1950 16.5.1968 Cамая поздняя дата: 05.08.1970
R=A+B+C, где A=53₁₀, B=653₈, C=DA₁₆, R=R₂ Эту задачу можно решать разными выбор зависит от умения решающего выполнять сложение в той или иной системе счисления. Но в любом варианте, сначала нужно представить А, В, С в какой-то одной системе счисления.
Посмотрим, как это будет выглядеть, если пользоваться привычной нам десятичной системой. 653₈ = 6·8²+5·8¹+3·8⁰ = 6·64+5·8+3 = 427 DA₁₆ = 13·16¹+10·16⁰ = 218 R₁₀ = 53+427+218 = 698 Переводим полученное число в двоичную систему, получая R₂: 698/2=349, остаток 0 349/2=174, остаток 1 174/2=87, остаток 0 87/2=43, остаток 1 43/2 =21, остаток 1 21/2=10, остаток 1 10/2=5, остаток 0 5/2=2, остаток 1 2/2=1, остаток 0 1/2=0, остаток 1 Выписываем остатки в обратном порядке: 1010111010. Это и есть ответ.
А теперь допустим, что мы хорошо владеем восьмеричной системой счисления. 1) получим А₈ 53/8=6, остаток 5 6/8=0, остаток 6 Выписываем остатки в обратном порядке: А₈=65 2) получим С₈, для чего перейдем сначала в двоичную систему С₂=1101 1010 (просто заменяем каждую цифру четырьмя двоичными). А теперь разобьем справа налево полученное значение по три разряда и каждую полученную триаду заменим восьмеричной цифрой. 11 011 010₂ = 332₈ 3) Выполним сложение R₈=A₈+B₈+C₈ 65 740 +653 +332
740 1272 Складывать в восьмеричной системе просто, если знать одну маленькую хитрость. 8 отличается от 10 на 2, поэтому и результат сложения в восьмеричной системе на 2 больше, чем в десятичной, если число превышает 7. Смотрим: 5+3=8, но это в десятичной, а в восьмеричной это на 2 больше, т.е. 10. Поэтому мы пишем 0 и +1 идет в следующий разряд. 6+5=11 и еще +1 от переноса, итого 12. Но в восьмеричной на 2 больше, т.е. 14. 4 пишем. +1 перенос. 6 и +1 от переноса - 7. Вот и получили 740. 4) Мы нашли R₈, переходим к R₂. Заменяем каждую восьмеричную цифру тремя двоичными: 1272₈=1 010 111 010₂ Мы получили тот же ответ, что и в предыдущем расчета.
Так что - дело привычки. Второй вариант кажется "непосвященному" сложнее, но на самом деле в нем меньше арифметики и если нет под рукой калькулятора, то может оказаться и быстрее, и удобнее.
nn=50;
type
data = record
number : 1..31;
month : 1..12;
year : 1901..1997
end;
var
d:array[1..nn] of data;
i,n,k:integer;
s,s1,s2,s3:string;
begin
Write('Количество дат (1..50)-> '); Read(n);
Writeln('Введите через пробел день, месяц, год: ');
for i:=1 to n do Read(d[i].number,d[i].month,d[i].year);
{ a }
Write('Самый ранний из годов: ');
k:=d[1].year;
for i:=2 to n do
if d[i].year<k then k:=d[i].year;
Writeln(k);
{ б }
Writeln('Все весенние даты');
for i:=1 to n do
if d[i].month in [3..5] then
Write(d[i].number,'.',d[i].month,'.',d[i].year,' ');
Writeln;
{ в }
Write('Cамая поздняя дата: ');
Str(d[1].year,s1); Str(d[1].month,s2); Str(d[1].number,s3);
if Length(s2)=1 then s2:='0'+s2;
if Length(s3)=1 then s3:='0'+s3;
s:=s1+s2+s3;
for i:=2 to n do
begin
Str(d[i].year,s1); Str(d[i].month,s2); Str(d[i].number,s3);
if Length(s2)=1 then s2:='0'+s2;
if Length(s3)=1 then s3:='0'+s3;
if s<s1+s2+s3 then s:=s1+s2+s3
end;
Writeln(Copy(s,7,2)+'.'+Copy(s,5,2)+'.'+Copy(s,1,4))
end.
Тестовое решение:
Количество дат (1..50)-> 6
Введите через пробел день, месяц, год:
18 4 1950
16 5 1968
5 8 1970
3 9 1968
11 6 1964
16 12 1967
Самый ранний из годов: 1950
Все весенние даты
18.4.1950 16.5.1968
Cамая поздняя дата: 05.08.1970
A=53₁₀,
B=653₈,
C=DA₁₆,
R=R₂
Эту задачу можно решать разными выбор зависит от умения решающего выполнять сложение в той или иной системе счисления. Но в любом варианте, сначала нужно представить А, В, С в какой-то одной системе счисления.
Посмотрим, как это будет выглядеть, если пользоваться привычной нам десятичной системой.
653₈ = 6·8²+5·8¹+3·8⁰ = 6·64+5·8+3 = 427
DA₁₆ = 13·16¹+10·16⁰ = 218
R₁₀ = 53+427+218 = 698
Переводим полученное число в двоичную систему, получая R₂:
698/2=349, остаток 0
349/2=174, остаток 1
174/2=87, остаток 0
87/2=43, остаток 1
43/2 =21, остаток 1
21/2=10, остаток 1
10/2=5, остаток 0
5/2=2, остаток 1
2/2=1, остаток 0
1/2=0, остаток 1
Выписываем остатки в обратном порядке: 1010111010.
Это и есть ответ.
А теперь допустим, что мы хорошо владеем восьмеричной системой счисления.
1) получим А₈
53/8=6, остаток 5
6/8=0, остаток 6
Выписываем остатки в обратном порядке: А₈=65
2) получим С₈, для чего перейдем сначала в двоичную систему
С₂=1101 1010 (просто заменяем каждую цифру четырьмя двоичными).
А теперь разобьем справа налево полученное значение по три разряда и каждую полученную триаду заменим восьмеричной цифрой.
11 011 010₂ = 332₈
3) Выполним сложение R₈=A₈+B₈+C₈
65 740
+653 +332
740 1272
Складывать в восьмеричной системе просто, если знать одну маленькую хитрость. 8 отличается от 10 на 2, поэтому и результат сложения в восьмеричной системе на 2 больше, чем в десятичной, если число превышает 7. Смотрим: 5+3=8, но это в десятичной, а в восьмеричной это на 2 больше, т.е. 10. Поэтому мы пишем 0 и +1 идет в следующий разряд. 6+5=11 и еще +1 от переноса, итого 12. Но в восьмеричной на 2 больше, т.е. 14. 4 пишем. +1 перенос. 6 и +1 от переноса - 7. Вот и получили 740.
4) Мы нашли R₈, переходим к R₂.
Заменяем каждую восьмеричную цифру тремя двоичными:
1272₈=1 010 111 010₂
Мы получили тот же ответ, что и в предыдущем расчета.
Так что - дело привычки. Второй вариант кажется "непосвященному" сложнее, но на самом деле в нем меньше арифметики и если нет под рукой калькулятора, то может оказаться и быстрее, и удобнее.
ответ: 1010111010