Нада сложить 2а числа в троичной симметричной системе, а числа заданны символьным типом данных..Помогите пожалуйста!
volvo
4.06.2008 11:35
В чем проблема? Не знаешь, как производятся операции в троичной симметричной системе? Поиск по форуму, по ключевой фразе "троич* уравновеш*" выдаст тебе несколько тем, в одной из которых присоединен PDF-файл, описывающий эту С/С и работу с ней...
Гость
4.06.2008 18:21
Ниполучаеться всё это в паскале реализовать, так разобрался с этой системой а как на паскале это сделать, незнаю, неполучаеться( Помоги пожалуйста если сможеш, завтра последний день сдавать надо(.... даж с динамическими структурами такого парева не было, а как эту задачу задали вообще ппц(
Гость
4.06.2008 18:29
Ниполучаеться всё это в паскале реализовать, так разобрался с этой системой а как на паскале это сделать, незнаю, неполучаеться( Помоги пожалуйста если сможеш, завтра последний день сдавать надо(.... даж с динамическими структурами такого парева не было, а как эту задачу задали вообще ппц(
Гость
4.06.2008 18:30
ой извеняюсь за флуд
Гость
4.06.2008 19: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 15: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)...
Спасибо огромное! Извеняюсь конечно но я не то написал сначал, нада было в несеммитричной, с ней я разобрался вот мой вариант :
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.
А прогу с симметричной по твоему рассказу я понял, вопросов не осталось! Спасибо огромное что разяснил!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.