Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Сложение в троично-симметричной системе

Автор: Kumpi 3.06.2008 23:34

Нада сложить 2а числа в троичной симметричной системе, а числа заданны символьным типом данных..Помогите пожалуйста!

Автор: volvo 4.06.2008 15:35

В чем проблема? Не знаешь, как производятся операции в троичной симметричной системе? Поиск по форуму, по ключевой фразе "троич* уравновеш*" выдаст тебе несколько тем, в одной из которых присоединен PDF-файл, описывающий эту С/С и работу с ней...

Автор: Гость 4.06.2008 22:21

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

Автор: Гость 4.06.2008 22:29

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

Автор: Гость 4.06.2008 22:30

ой извеняюсь за флуд

Автор: Гость 4.06.2008 23:40

Вот посматри

uses crt;
var
n, ost: integer;
s,l,g: string;
procedure q ;
begin
clrscr;
write('n = '); readln(n);

s := '';
while n >= 3 do begin
ost := n mod 3;

case ost of
0: s := '0' + s;
1: s := '+' + s;
2: s := '+-' + s;
end;

n := n div 3;
end;

case n of
0: s := '0' + s;
1: s := '+' + s;
2: s := '+-' + s;
end;
writeln('s(3) = ', s);
end;
procedure wq ;
begin
write('n = '); readln(n);

l := '';
while n >= 3 do begin
ost := n mod 3;

case ost of
0: l := '0' + l;
1: l := '+' + l;
2: l := '+-' + l;
end;

n := n div 3;
end;

case n of
0: l := '0' + l;
1: l := '+' + l;
2: l := '+-' + l;
end;
writeln('l(3) = ', l);
end;
procedure qw;
begin
g:=s+l;
write (g);
end;
begin
q;
wq;
qw;
end.
это конечно бред тупа 2е строчки складывает да и мне нужно чтоб вводить в троичной, ничего не понял(( помогите пожалуйста

Автор: volvo 5.06.2008 19:40

Смотри:

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

Вопросы?

Автор: kump 6.06.2008 1:55

Спасибо огромное! Извеняюсь конечно но я не то написал сначал, нада было в несеммитричной, с ней я разобрался вот мой вариант :

uses crt;
procedure vvod (var s1:string; var s2:string; var k:boolean);
var i:integer;
begin
k:=false;
writeln ('vvedite chislo v 3oichnoi sisteme');
readln (s1);
for i:=1 to length (s1) do
if (s1[i]<'0') or (s1[i]>'2') then
begin
writeln ('vvedeno chislo ne v troichnoi sisteme');
k:=true;
exit;
end;
writeln ('‘vvedite vtoroe chislo v troichnoi sisteme');
readln (s2);
for i:=1 to length (s2) do
if (s2[i]<'0') or (s2[i]>'2') then
begin
writeln ('vvedeno chislo ne v troichnoi sisteme');
k:=true;
exit;
end;
end;
procedure summa (var s1:string; var s2:string; var rez:string);
var i,max,min,c,t1,t2,p,slag:integer;
maxs,mins,simv:string;
begin
if length(s1)>length(s2) then
begin
max:=length(s1);
min:=length(s2);
maxs:=s1;
mins:=s2;
end
else
begin
max:=length(s2);
min:=length(s1);
maxs:=s2;
mins:=s1;
end;
for i:=1 to (max-min+1) do
mins:='0' +mins;
maxs:='0' +maxs;
p:=0;
for i:=max+1 downto 1 do
begin
val (maxs[i],t1,c);
val (mins[i],t2,c);
slag:=t1+t2+p;
if slag>2 then
begin
p:=1;
slag:=slag-3;
end
else p:=0;
str(slag,simv);
rez:=simv+rez;
end;
end;
procedure vivod (var rez:string; var k:boolean);
begin
if k=false then
writeln ('otvet: ',rez);
readln;
end;
var s1,s2,rez:string;
k:boolean;
begin
clrscr;
vvod (s1,s2,k);
summa (s1,s2,rez);
vivod (rez,k);
end.
А прогу с симметричной по твоему рассказу я понял, вопросов не осталось! Спасибо огромное что разяснил!