Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
FLiN
0 / 0 / 0
Регистрация: 22.04.2014
Сообщений: 15
1

Умножение двух двоичных чисел

22.04.2014, 16:29. Просмотров 1417. Ответов 11
Метки нет (Все метки)

Помогите создать подпрограмму для умножения двух чисел в двоичной системе!(паскаль)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2014, 16:29
Ответы с готовыми решениями:

Умножение двоичных чисел в дополнительном коде
Нужно написать программу для умножения двоичных чисел в дополнительном коде, чтобы каждое действие...

Написать программу умножения двух двоичных вещественных чисел
Доброго времени суток, уважаемые участники форума. Поюзал поиск и не нашёл чего-то похожего (каюсь,...

Деление двоичных чисел столбиком
Всем доброго времени суток! Пытаюсь реализовать алгоритм деления двоичных чисел столбиком на...

Сложение двух чисел Рекурсивное определение операции сложения двух чисел и другие
Помогите составить программы целиком (всё с рекурсией). 1. Сложение двух чисел (а+b)....

Вычитание и умножение двух дробей
Напишите программу с использованием процедур для выполнения арифметических действий с обычными...

11
Puporev
Модератор
57522 / 43859 / 30299
Регистрация: 18.05.2008
Сообщений: 104,730
23.04.2014, 12:40 2
Лучший ответ Сообщение было отмечено FLiN как решение

Решение

Можно так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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'..'1'] then //если допустимые
 begin
  write(c);//выводим
  n:=n+1; //добавляем разряд
  a[n]:=ord(c)-48 //переводим символы в цифры
 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 2;//в следующий разряд излишки
   c[na-i+1+nb-j]:=(c[na-i+1+nb-j]+a[i]*b[j])mod 2;//в текущий остаток от деления на 16
 end;
writeln('Результат:');
{пропускаем начальные нули}
i:=2*nmax;
while (c[i]=0)and(i>1)do i:=i-1;
{выводим результат}
for j:=i downto 1 do
write(c[j])
end;
 
var a,b,c:mas;
    na,nb,nc:integer;
begin
writeln('Введите 1 число в СС 2, конец ввода Enter');
na:=vvod(a);
writeln('Введите 2 число в СС 2, конец ввода Enter');
nb:=vvod(b);
umn(a,b,na,nb,c,nc)
end.
1
FLiN
0 / 0 / 0
Регистрация: 22.04.2014
Сообщений: 15
23.04.2014, 19:27  [ТС] 3
Спасибо большое!!!
А как быть, если числа вводятся не посимвольно (с клавиатуры), а уже готовые?
0
Puporev
Модератор
57522 / 43859 / 30299
Регистрация: 18.05.2008
Сообщений: 104,730
23.04.2014, 19:51 4
Да также, просто введенные строки преобразуете в массивы. А можно и сразу со строками работать.
1
23.04.2014, 19:51
FLiN
0 / 0 / 0
Регистрация: 22.04.2014
Сообщений: 15
23.04.2014, 20:30  [ТС] 5
Извините, что беспокою вас еще раз. Если работать сразу с вводимыми строками, что нужно поменять?
0
Puporev
Модератор
57522 / 43859 / 30299
Регистрация: 18.05.2008
Сообщений: 104,730
23.04.2014, 20:44 6
Лучший ответ Сообщение было отмечено FLiN как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
uses crt;
var s1,s2,s:string;
    a,b,c:array[1..255] of byte;
    na,nb,nc,i,j:byte;
begin
writeln('Введите первое число в СС 2');
readln(s1);
writeln('Введите второе число в СС 2');
readln(s2);
na:=length(s1);
for i:=1 to na do
a[i]:=ord(s1[i])-48;
nb:=length(s2);
for i:=1 to nb do
b[i]:=ord(s2[i])-48;
for i:=1 to 255 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 2;//в следующий разряд излишки
   c[na-i+1+nb-j]:=(c[na-i+1+nb-j]+a[i]*b[j])mod 2;//в текущий остаток от деления на 16
 end;
writeln('Результат:');
{пропускаем начальные нули}
i:=255;
while (c[i]=0)and(i>1)do i:=i-1;
{выводим результат}
for j:=i downto 1 do
write(c[j])
end.
1
FLiN
0 / 0 / 0
Регистрация: 22.04.2014
Сообщений: 15
24.04.2014, 20:12  [ТС] 7
Огромное спасибо за помощь!!!
А возможно ли на выходе получить строку?
0
Puporev
Модератор
57522 / 43859 / 30299
Регистрация: 18.05.2008
Сообщений: 104,730
24.04.2014, 20:21 8
Конечно можно, но зачем?
0
FLiN
0 / 0 / 0
Регистрация: 22.04.2014
Сообщений: 15
24.04.2014, 20:32  [ТС] 9
Просто необходимо для дальнейших действий. Сама программа гоняет два числа из системы в систему, в конце конце они должны быть перемножены и возвращены в исходную систему. Эта программа оперирует в основном строками. Как видите, я застрял на умножении.
0
Puporev
Модератор
57522 / 43859 / 30299
Регистрация: 18.05.2008
Сообщений: 104,730
24.04.2014, 20:35 10
Так и делайте умножение строками раз число разрядов не превышает 255,зачем гонять в из строки в массив и обратно. Алгоритм есть, подумайте чуть и перепишите.

Добавлено через 1 минуту
Но если вы понятия не имеете как из массива получить строку, а из символа цифру, то я в этом не участвую.
1
Ty4kaop
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 5
24.12.2015, 00:08 11
Что с этим делать???
0
Миниатюры
Умножение двух двоичных чисел  
Azazel-San
Mental handicap
1083 / 541 / 154
Регистрация: 24.11.2015
Сообщений: 2,195
Завершенные тесты: 1
24.12.2015, 09:52 12
Ty4kaop, антивирус отключить
0
24.12.2015, 09:52
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2015, 09:52

Найти сумму пяти двоичных чисел. Найдите ошибку
Помогите найти ошибку. Выдает неверный ответ. Условие программы вычеслить сумму пяти двоичных...

Рекурсия: умножение двух квадратных матриц одного порядка
Здравствуйте, проблема такова: нужно сделать рекурсивную процедуру для умножения двух квадратных...

Составьте программу, вычисляющую для двух дробей a/b и c/d : деление, умножение и сложение
составьте программу, вычисляющую для двух дробей a/b и c/d : деление, умножение и сложение....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.