В файле numbers.dat записаны два числа: одно в восьмеричной системе, а другое — в шестнадцатеричной. Причем
281
427
Ответы на вопрос:
Решение задачи основано на быстром (поразрядном) переводе входных данных в двоичную систему счисления. Каждая цифра восьмеричного числа, за исключением первой, заменяется на 3 двоичные цифры, а каждая цифра шестнадцатеричного — на 4. Программа читает цифры из файла, запоминая в массиве результат перевода в двоичную систему. Далее сравниваются длины полученных массивов. Только если они равны, то производится их поэлементное сравнение, начиная со старшего разряда
Программа составлена верно, т.е. правильно сравнивает достаточно большие числа, не переводя их в десятичную систему. При переводе символа цифры в его числовое значение не анализируется каждый символ в отдельности. Допускается наличие в тексте программы одной пунктуационной ошибки. Пример правильной и эффективной программы:
var a,b:array[1..4000] of 0..1;
n,m,i,j,k,l1,l2,p:integer;
c:char;
begin
assign(input,'numbers.dat'); reset(input);
readln(n); read(c);
k:=ord(c)-ord('0'); p:=4; l1:=0;
while k div p =0 do p:=p div 2;
while p>0 do
begin
l1:=l1+1; a[l1]:=k div p;
k:=k mod p; p:=p div 2
end;
for i:=2 to n do
begin
read(c); k:=ord(c)-ord('0');
p:=4;
for j:=1 to 3 do
begin
l1:=l1+1; a[l1]:=k div p;
k:= k mod p; p:=p div 2
end
end;
readln(m); read(c); p:=8; l2:=0;
if c in ['1'..'9'] then k:=ord(c)-ord('0')
else k:=ord(c)-ord('A')+10;
while k div p = 0 do p:=p div 2;
while p>0 do
begin
l2:=l2+1; b[l2]:=k div p;
k:= k mod p; p:=p div 2
end;
for i:=2 to m do
begin
read(c); p:=8;
if c in ['0'..'9'] then k:=ord(c)-ord('0')
else k:=ord(c)-ord('A')+10;
for j:=1 to 4 do
begin
l2:=l2+1; b[l2]:=k div p;
k:= k mod p; p:=p div 2
end
end;
if l1<l2 then writeln('<') else
if l1>l2 then writeln('>') else
begin
i:=1;
while (i<l1)and(a[i]=b[i]) do i:=i+1;
if a[i]<b[i] then writeln('<') else
if a[i]>b[i] then writeln('>') else writeln('=')
end
end.
Программа составлена верно, т.е. правильно сравнивает достаточно большие числа, не переводя их в десятичную систему. При переводе символа цифры в его числовое значение не анализируется каждый символ в отдельности. Допускается наличие в тексте программы одной пунктуационной ошибки. Пример правильной и эффективной программы:
var a,b:array[1..4000] of 0..1;
n,m,i,j,k,l1,l2,p:integer;
c:char;
begin
assign(input,'numbers.dat'); reset(input);
readln(n); read(c);
k:=ord(c)-ord('0'); p:=4; l1:=0;
while k div p =0 do p:=p div 2;
while p>0 do
begin
l1:=l1+1; a[l1]:=k div p;
k:=k mod p; p:=p div 2
end;
for i:=2 to n do
begin
read(c); k:=ord(c)-ord('0');
p:=4;
for j:=1 to 3 do
begin
l1:=l1+1; a[l1]:=k div p;
k:= k mod p; p:=p div 2
end
end;
readln(m); read(c); p:=8; l2:=0;
if c in ['1'..'9'] then k:=ord(c)-ord('0')
else k:=ord(c)-ord('A')+10;
while k div p = 0 do p:=p div 2;
while p>0 do
begin
l2:=l2+1; b[l2]:=k div p;
k:= k mod p; p:=p div 2
end;
for i:=2 to m do
begin
read(c); p:=8;
if c in ['0'..'9'] then k:=ord(c)-ord('0')
else k:=ord(c)-ord('A')+10;
for j:=1 to 4 do
begin
l2:=l2+1; b[l2]:=k div p;
k:= k mod p; p:=p div 2
end
end;
if l1<l2 then writeln('<') else
if l1>l2 then writeln('>') else
begin
i:=1;
while (i<l1)and(a[i]=b[i]) do i:=i+1;
if a[i]<b[i] then writeln('<') else
if a[i]>b[i] then writeln('>') else writeln('=')
end
end.
Популярно: Другие предметы
-
эмирия11.10.2021 09:03
-
ISMAL200929.05.2021 17:28
-
mn19705.07.2021 04:26
-
ewvyevs03.07.2020 16:52
-
Unicorn47125.06.2022 03:58
-
Dmitry023214129.11.2020 18:16
-
Kiryshka253224.03.2021 23:32
-
Semykina200309.02.2021 08:55
-
yanameleshko201619.12.2020 13:18
-
АнгелінаL27.07.2020 23:02