В файле numbers.dat записаны два числа: одно в восьмеричной системе, а другое — в шестнадцатеричной. Причем

Вопрос посетителя

В файле numbers.dat записаны два числа: одно в восьмеричной системе, а другое — в шестнадцатеричной. Причем в первой строке файла расположено число 1  N  1000 — количество восьмеричных цифр в первом числе, во второй строке — само восьмеричное число, в третьей строке записано число M — количество шестнадцатеричных цифр во втором числе, в четвертой строке — само шестнадцатеричное число (данные корректны). Цифры, большие 9, при этом обозначаются заглавными латинскими буквами A, B, C и т.д. Требуется написать программу на языке Паскаль или Бейсик, которая будет сравнивать данные числа между собой и выводить на экран знак <, > или =, в зависимости от результата сравнения. Например, если входной файл был таким:
2
13
1
C
то результат должен быть следующим:
<

Ответ эксперта

Решение задачи основано на быстром (поразрядном) переводе входных данных в двоичную систему счисления. Каждая цифра восьмеричного числа, за исключением первой, заменяется на 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  if l1>l2 then writeln(‘>’) else
 begin
 i:=1;
 while (i  if a[i]  if a[i]>b[i] then writeln(‘>’) else writeln(‘=’)
 end
end.

image_pdfСкачать ответimage_printРаспечатать решение

Добавить комментарий

Похожие вопросы от пользователей