Умножение двух восьмеричных чисел - Pascal ABC

Узнай цену своей работы

Формулировка задачи:

Умножить 216 и 5 в восьмеричной СС, в принципе всё.

Решение задачи: «Умножение двух восьмеричных чисел»

textual
Листинг программы
uses crt;
const nmax=1000;//макс. число разрядов во вводимых числах
type mas=array[1..2*nmax] of byte;//тип массива, число разрядов *2 для результата
function vvod(var a:mas):integer;//ввод чисел
var c:char;
    n:integer;
begin
n:=0; //количество разрядов
repeat
c:=readkey; //вводим посимвольно
if c in ['0'..'9','A'..'F'] then //если допустимые
 begin
  write(c);//выводим
  n:=n+1; //добавляем разряд
  if c in ['0'..'9'] then a[n]:=ord(c)-48 //если цифра пишем в массив 0..9
  else a[n]:=ord(c)-55 //если буква 10..15
 end;
if (c=#13)or(n=nmax) then writeln //если Enter или макс. разрядов, новая строка
until (c=#13)or(n=nmax);//и выход
vvod:=n//кол. разрядов
end;
//собственно умножение
procedure umn(a,b:mas;na,nb:integer;var c:mas;var nc:integer);
var i,j,p,k:integer;
begin
for i:=1 to 2*nmax do c[i]:=0; //обнулим результат
for i:=na downto 1 do //перемножим поразрядно
for j:=nb downto 1 do
 begin
   c[na-i+2+nb-j]:=c[na-i+2+nb-j]+(c[na-i+1+nb-j]+a[i]*b[j])div 16;//в следующий разряд излишки
   c[na-i+1+nb-j]:=(c[na-i+1+nb-j]+a[i]*b[j])mod 16;//в текущий остаток от деления на 16
 end;
writeln('Результат:');
{пропускаем начальные нули}
i:=2*nmax;
while (c[i]=0)and(i>1)do i:=i-1;
{выводим результат}
for j:=i downto 1 do
if c[j] in [0..9] then write(c[j])
else write(chr(c[j]+55));
end;
 
var a,b,c:mas;
    na,nb,nc:integer;
begin
writeln('Введите 1 число в СС 16, конец ввода Enter');
na:=vvod(a);
writeln('Введите 2 число в СС 16, конец ввода Enter');
nb:=vvod(b);
umn(a,b,na,nb,c,nc)
end.

Объяснение кода листинга программы

  1. В функции vvod переменная n инициализируется значением 0. Это количество разрядов, которое будет введено.
  2. В цикле repeat переменная c считывается с помощью функции readkey. Если введенная цифра или буква соответствует допустимому диапазону, то она выводится на экран, а переменная n увеличивается на 1. Если введенная цифра, то она записывается в соответствующий разряд массива a. Если это буква, то она записывается в массив a с индексом n.
  3. После ввода всех разрядов, функция vvod возвращает значение n, которое является количеством введенных разрядов.
  4. В процедуре umn переменные i, j, p и k инициализируются значениями 1, 2, 2na и 2nb соответственно.
  5. В цикле for перемножаются разряды числа a и числа b. Результат сохраняется в массиве c.
  6. В цикле while пропускаются нулевые значения в массиве c.
  7. В цикле for выводятся результаты умножения. Если введенное число c[j] является цифрой, то оно выводится на экран. Если это буква, то выводится символ, соответствующий этой букве, увеличенный на 55.
  8. В конце программы выводится сообщение о том, что введено 1 число в СС 16, и запрашивается ввод 2 числа. Затем вызывается функция vvod для ввода двух чисел, и вызывается процедура umn для их умножения.

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы