За с клавиатуры 16-ричное число (переменная х16 строкового типа string), в переменной х8 сформировать его 8-ричное представление. Результат вывести на экран.
Для удобства вычислений переведём размер сканируемого изображения в дюймы: 20,32 × 20,32 (см) = 8 × 8 (inch).
Сначала найдём количество пикселей по горизонтали, по вертикали, затем общее количество пикселей, исходя из разрешающей сканера. Зная, что каждый пиксель кодируется 4 битами, найдём объём памяти, необходимый для хранения графической информации, что и будет являться информационным объёмом файла.
1) 600 × 8 = 4800 (px) – количество пикселей по горизонтали.
2) 1200 × 8 = 9600 (px) – количество пикселей по вертикали.
Если число 49 записывается как 121, значит первый остаток от деления равен 1, то есть основанием системы счисления является число, кратное 48.
121 имеет 3 разряда, значит основание однозначно меньше 10 и больше 2. Подходят 3, 4, 6, 8.
Учитывая, что в числе 121 три разряда, значит число 48 делилось всего три раза. Число 8 не подойдет, т.к. 48/8=6, значит будет всего два деления. Число 3 не подойдет, т.к. 48/3 = 16, 16/3=5 - то есть тут будет больше трёх знаков. Число 4 не подойдет, т.к. 48/4=12, а 12 делится на 4 без остатка, но, судя по числу, во втором делении остаток должен быть равен 2. Остаётся число 6. Проверим
// PascalABC.NET
// количество знаков - произвольное!
function HexDigitToBin(Self: char): string; extensionmethod;
begin
var bd: array of string := ('0000', '0001', '0010', '0011',
'0100', '0101', '0110', '0111', '1000', '1001', '1010',
'1011', '1100', '1101', '1110', '1111');
var hd := '0123456789ABCDEF';
var i := Pos(Self.ToUpper, hd);
Result := if i > 0 then bd[i - 1] else '****'
end;
function Bin4ToOct(Self: string): char; extensionmethod;
begin
var od: array of string := ('000', '001', '010', '011',
'100', '101', '110', '111');
var i := od.FindIndex(p -> p = Self);
Result := if i < 0 then '*' else i.ToString.First
end;
function HexToOct(Self: string): string; extensionmethod;
begin
var t := '';
foreach var c in Self do
t += c.HexDigitToBin;
var L := t.Length;
t := '0' * ((3 - L mod 3) mod 3) + t;
L := t.Length;
var n := L div 3;
Result := '';
for var i := 0 to n - 1 do
Result += t[3 * i + 1: 3 * i + 4].Bin4ToOct;
end;
begin
var x16 := ReadString('Введите 16-ричное число:');
var x8 := x16.HexToOct;
x8.Print
end.