|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
12.01.2015, 03:29 | #1 (permalink) |
Member
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Сложить двоичные числа в Pascal
|
12.01.2015, 03:29 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Посмотрите внимательно тут, может разгадка совсем рядом Pascal: Числа, не входящие в одномерный массив Числа Фибоначчи в Паскале |
12.01.2015, 11:55 | #2 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Код:
Var n,i:byte; M,M1,T:LongInt; Function Bin2Dec(b:Longint):Integer; var Q,r:Integer; B1:Longint; begin B1:=b; Q:=B1 mod 10; B1:=B1 div 10; r:=1; repeat r:=r*2; Q:=Q+(B1 mod 10)*r; B1:=B1 div 10; until B1=0; Bin2Dec:=Q; end; Function Sum2Bin(b1,b2:LongInt):LongInt; var b1a,b2a,b3,r:LongInt; c1,c2,c3,d:Byte; begin b1a:=b1; b2a:=b2; b3:=0; r:=1; d:=0; repeat c1:=b1a mod 10; c2:=b2a mod 10; if (c1+c2+d=0) or (c1+c2+d=1) then begin c3:=c1+c2+d; d:=0; end else if (c1+c2+d)=2 then begin c3:=0; d:=1; end else begin c3:=1; d:=1; end; b3:=b3+c3*r; r:=r*10; b1a:=b1a div 10; b2a:=b2a div 10; until (b1a=0) and (b2a=0); b3:=b3+d*r; Sum2Bin:=b3; end; Begin Write('n (<=8) = '); Readln(n); Randomize; T:=1; for i:=1 to n-1 do begin M:=M+Random(2)*T; T:=T*10; end; M:=M+T; M1:=M*10; Writeln(' M Binary: ',M); Writeln(' M Decimal: ',Bin2Dec(M)); Writeln('3M Binary: ',Sum2Bin(M,M1)); Writeln('3M Decimal: ',Bin2Dec(Sum2Bin(M,M1))); Readln End. Программа писалась и отлаживалась в нормальном Паскале (Free, Turbo). Если у Вас этот зловонный АВС (у себя подобной гадости не держу), то следует: 1. Спереди присобачить Program Tralala; 2. Всюду LongInt заменить на Integer. |
|
15.01.2015, 22:58 | #3 (permalink) |
Member
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Vladimir_S, спасибо, что решили. Но я вот всё разбираюсь, а что-то не совсем понимаю, почему второе число мы умножаем на 10, что от этого происходит? (наверное это очень глупые вопросы, но я хочу во всём этом разбираться и понимать).
|
15.01.2015, 23:08 | #4 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
В задаче речь идет об умножении на 3 - это аналог умножения на одиннадцать в десятичной системе. На этом и строится алгоритм: сперва умножаем на 2, т.е. сдвигаем все цифры влево и приписываем 0, а потом к этому прибавляем (в двоичной арифметике) само исходное число. Ну а как проще всего объяснить компьютеру, что нужно сдвинуть все разряды влево и справа присобачить ноль? А умножить на 10. |
|
15.01.2015, 23:18 | #5 (permalink) |
Member
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Vladimir_S, ещё раз спасибо! Всё понятно теперь.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
16.01.2015, 09:51 | #7 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
1. В основной программе: n - разрядность (количество знаков) двоичного числа i - переменная цикла М - само число. Формируется методом случайной генерации нулей и единиц от младшего разряда до (n-1)-го. В старший (n-й) разряд всегда записывается 1. Т - счетчик разрядов М1 - результат сдвига влево всех разрядов числа М на один и приписывания справа нуля. В двоичной записи соответствует умножению числа М на два. Для "внутреннего употребления" М1=М*10. 2. В функции Bin2Dec (преобразование двоичного числа в десятичное): b, B1 - преобразуемое двоичное число Q - очередная значащая цифра (0 или 1), начиная с младшего разряда r - двоичный вес очередного разряда D - лишний идентификатор. Убрал. 3. В функции двоичного сложения Sum2Bin: b1,b2 (b1a,b2a) - складываемые двоичные числа b3 - формируемая двоичная сумма r - десятичный вес разряда с1, с2, с3 - цифры (0 или 1) в очередном разряде складываемых чисел и суммы. d - переносимая в следующий разряд цифра. |
|
18.01.2015, 15:07 | #8 (permalink) |
Member
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Vladimir_S, Здравствуйте! Я вчера сдавала данную задачу и мне сказали, чтобы сделать её более просто, чтобы можно было ввести любое по размеру двоичное число и сделать всё с помощью функции и не переводить 3 в десятичную систему счисления. Я кое-что написала (не знаю правильно ли), но не могу разобраться как посчитать число p. Вы может знаете как это сделать? подскажите пожалуйста!
program nomer_589(c); function um(const s: string): longint; var i: integer; r: longint; begin r := 0; for i := 1 to length(s) do begin if (s[i] = '1') or (s[i] = '0') then r := r * 2 + (ord(s[i]) - ord('0')) else begin um := -i; exit; end; end; um := r end; function umnogenie(dec: longint): string; begin if dec = 0 then umnogenie := '' else if odd(dec) then umnogenie := umnogenie( dec div 2) + '1' else umnogenie := umnogenie(dec div 2) + '0'; end; const t = 3; var s: string; d1: longint; begin Write('введите первое двоичное число: '); ReadLn(s); d1 := um(s); WriteLn('Произведение равно ', umnogenie( d1 * t )); Readln end. |
18.01.2015, 15:12 | #10 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|