Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 12.01.2015, 03:29   #1 (permalink)
Asya_inter
Member
 
Аватар для Asya_inter
 
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Сложить двоичные числа в Pascal

Как это сделать не знаю. Но думаю, что нужно складыват число 3 раза. Подскажите, вот задача:Даны натуральное число n, целые числа a0, ..., an такие, что каждое ai равно нулю или единице и an ≠ 0. Последовательность a0, ..., an задает двоичное предстовление некоторого целого числа p = an2n + ... + a12 + a0. Получить последовательность нулей и едениц задающую двоичное представление числа 3p
Asya_inter вне форума   Ответить с цитированием

Старый 12.01.2015, 03:29
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Посмотрите внимательно тут, может разгадка совсем рядом

Pascal: Числа, не входящие в одномерный массив
Числа Фибоначчи в Паскале

Старый 12.01.2015, 11:55   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Asya_inter Посмотреть сообщение
Как это сделать не знаю. Но думаю, что нужно складыват число 3 раза.
Вовсе не обязательно. Можно обойтись сложением двух чисел, одно из которых - исходное, второе - исходное, умноженное на 10. Вот так (здесь десятичная форма служит только для контроля и наглядности):
Код:
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.
Vladimir_S вне форума   Ответить с цитированием
Старый 15.01.2015, 22:58   #3 (permalink)
Asya_inter
Member
 
Аватар для Asya_inter
 
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Vladimir_S, спасибо, что решили. Но я вот всё разбираюсь, а что-то не совсем понимаю, почему второе число мы умножаем на 10, что от этого происходит? (наверное это очень глупые вопросы, но я хочу во всём этом разбираться и понимать).
Asya_inter вне форума   Ответить с цитированием
Старый 15.01.2015, 23:08   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Asya_inter Посмотреть сообщение
Vladimir_S, спасибо, что решили. Но я вот всё разбираюсь, а что-то не совсем понимаю, почему второе число мы умножаем на 10, что от этого происходит? (наверное это очень глупые вопросы, но я хочу во всём этом разбираться и понимать).
Понимаете, числа-то двоичные, но записываем и храним мы их, как десятичные. Например, есть двоичное число 111 (7). Какой двоичный вид будет иметь это число, если мы умножим его на 2? В десятичной системе, ясное дело, 7*2=14. А в двоичной? В двоичной умножение на 2 - это всё равно, что в десятичной - на 10, т.е. все цифры нужно сдвинуть влево и приписать 0. В результате получаем 1110, т.е. те же 14.
В задаче речь идет об умножении на 3 - это аналог умножения на одиннадцать в десятичной системе. На этом и строится алгоритм: сперва умножаем на 2, т.е. сдвигаем все цифры влево и приписываем 0, а потом к этому прибавляем (в двоичной арифметике) само исходное число. Ну а как проще всего объяснить компьютеру, что нужно сдвинуть все разряды влево и справа присобачить ноль? А умножить на 10.
Vladimir_S вне форума   Ответить с цитированием
Старый 15.01.2015, 23:18   #5 (permalink)
Asya_inter
Member
 
Аватар для Asya_inter
 
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Vladimir_S, ещё раз спасибо! Всё понятно теперь.
Asya_inter вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 16.01.2015, 00:57   #6 (permalink)
Asya_inter
Member
 
Аватар для Asya_inter
 
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Извините, а можете ещё прокомментировать значения переменных, если вам не трудно?
Asya_inter вне форума   Ответить с цитированием
Старый 16.01.2015, 09:51   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Asya_inter Посмотреть сообщение
Извините, а можете ещё прокомментировать значения переменных, если вам не трудно?
Да не трудно, пожалуйста.

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 - переносимая в следующий разряд цифра.
Vladimir_S вне форума   Ответить с цитированием
Старый 18.01.2015, 15:07   #8 (permalink)
Asya_inter
Member
 
Аватар для Asya_inter
 
Регистрация: 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.
Asya_inter вне форума   Ответить с цитированием
Старый 18.01.2015, 15:11   #9 (permalink)
Asya_inter
Member
 
Аватар для Asya_inter
 
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию задача 589

Вот задача эта, а то может у меня непонятно написано.
Миниатюры
pkbai9bzm18.jpg  
Asya_inter вне форума   Ответить с цитированием
Старый 18.01.2015, 15:12   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Asya_inter Посмотреть сообщение
Vladimir_S, Здравствуйте! Я вчера сдавала данную задачу и мне сказали, чтобы сделать её более просто, чтобы можно было ввести любое по размеру двоичное число и сделать всё с помощью функции и не переводить 3 в десятичную систему счисления.
Через строки? И это называется "более просто"?!! Ну-ну...
Цитата:
Сообщение от Asya_inter Посмотреть сообщение
Я кое-что написала (не знаю правильно ли), но не могу разобраться как посчитать число p. Вы может знаете как это сделать? подскажите пожалуйста!
Хорошо, посмотрю. Где-то через час.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 01:25.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.