IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Сложение в троично-симметричной системе, Нада сложить 2а числа в троичной симметричной системе, а числа заданны
Kumpi
сообщение 3.06.2008 19:34
Сообщение #1


Гость






Нада сложить 2а числа в троичной симметричной системе, а числа заданны символьным типом данных..Помогите пожалуйста!
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 5.06.2008 15:40
Сообщение #2


Гость






Смотри:

const
s1: string = '+-+';
s2: string = '+-+';

letters: array[-1 .. 1] of char =
('-', '0', '+');

sum: array[1 .. 3] of record
ch, p: integer
end =
( (ch: 1; p:0),
(ch:-1; p:1),
(ch: 0; p:1) );

function value(ch: char): integer;
var i: integer;
begin
for i := -1 to 1 do begin
if letters[i] = ch then value := i;
end;
end;

var
res: string;
s, p, i: integer;

begin
res := '';
{ уравниваем длины 2-х строк, для чего к более короткой добавляем '0' спереди }
while length(s1) <> length(s2) do
if length(s1) < length(s2) then s1 := '0' + s1
else s2 := '0' + s2;

p := 0; { <--- Перенос в следующий разряд, изначально = 0 }

{ теперь проходим по всем разрядам от младшего у старшему... }
for i := length(s1) downto 1 do begin

s := value(s1[i]) + value(s2[i]) + p; { <--- сумма соотв. разрядов чисел и переноса }
if s = 0 then begin
{
если сумма = 0, значит ничего не менять: в соотв. разряд результата пишем 0,
и перенос тоже = 0
}
res := '0' + res; p := 0;
end
else begin
{ сумма не нулевая, см. объяснение ниже }
res := letters[(s div abs(s)) * sum[abs(s)].ch] + res;
p := (s div abs(s)) * sum[abs(s)].p
end;

end;
{ ну, и добавляем символ, если есть ненулевой перенос }
if p <> 0 then res := letters[p] + res;

writeln(res);

end.


Теперь о том, что творится если сумма не равна 0... Тогда возможны такие комбинации:
1а) s = 1 ==> в результат добавляется 1, перенос = 0
1б) s = -1 ==> в результат добавляется -1, перенос = 0

2а) s = 2 ==> в результат пишем -1, переносим 1 (то есть, отнимаем 1, добавляем 3; в итоге +2)
2б) s = -2 ==> в результат пишем 1, переносим -1 (прибавляем 1, отнимаем 3; итого -2)

3а) s = 3 ==> в результат пишем 0, переносим 1
3б) s = -3 ==> в результат пишем 0, переносим -1

Как видим, все результаты и переносы для разнознаковых сумм тоже имеют разный знак, поэтому вместо того, чтобы описывать массив sum[-3 .. 3], я сделал его от 1 до 3, и если сумма отрицательная, то я просто меняю знак для ch и p... (изменение знака достигается умножением на s div abs(s), что будет содержать 1 если S > 0, и -1 если S < 0)...

В качестве теста: 7 + 7 = "+-+" + "+-+" = "+---" = 33 - 32 - 31 - 30 = 27 - 9 - 3 - 1 = 14

Вопросы?

Сообщение отредактировано: volvo - 5.06.2008 15:57
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 12.08.2025 13:13
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"