Помощь - Поиск - Пользователи - Календарь
Полная версия: Перевод числа из десятичной с.с. в троичную уравновешенную
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
НУК
Люди подскажите пожалуйста алгоритм перевода целого числа из десятичной с.с. в троичную уравновешенную. и что это за система такая троичная уравновешенная? blink.gif
volvo
... Еще одна разновидность позиционных нумераций - уравновешенные системы счисления. В качестве примера рассмотрим так называемую троичную уравновешенную систему счисления. Ее алфавит состоит из трех (поэтому - "троичная"!) элементов:
A3={1, 0, 1},
где красный цвет использован для обозначения "минус 1". Присутствие такой "nega-единицы" в соответствующем разряде числа означает, что этот разряд учитывается со знаком "минус". Например:
1101(3)=((-1)*3^0+0*3^1+(-1)*3^2+1*3^3)(10)= 17(10)

Уравновешенная система счисления не является лишь "математическим фокусом". С ее помощью удобно представлять числа, соответствующие, в частности, использованию двухчашечных весов, на которых гири, для уравновешивания чашек, учитываются со знаками как "+", так и "-".

К существенному достоинству этой нумерации следует отнести тот факт, что при вычислениях на ее основе отпадает необходимость в операции "вычитания". Действительно, изменение знака числа на противоположный осуществляется простой заменой всех 1 на 1 и наоборот. Скажем, число -17(10) запишется как 1101(3).
НУК
Спасибо большое ! еще бы кто нибудь алгоритм привел перевода было бы вообще замечательно smile.gif
volvo
Вот PDF с сайта http://www.ternary.info/:
Там приведены основные правила работы с троичными системами счисления (в том числе и перевод (10) -> (3))
НУК
попробывал я написать эту программу перевода вот что у меня получилось:

var

n,i: integer;
st: string;
k,j,v,code: integer;
sum: real;


begin


writeln('vvedite n');
readln(n);
str(n,st);
j:= 3;



for i:=1 to length(st) do

begin

val(st[i],v,code);
sum:= (k * exp(3*ln(i)));


end;

writeln(sum);
readln;

end


но вывоит она очень странный ответ wacko.gif , может кто подскажет в чем дело и заодно как сделать, чтоб и -1 тоже считалось
volvo
Значит, неправильно сделал... Вот это выводит те же ответы, которые записаны в PDF ("0" = 0, "+" = 1, "-" = -1):
var
  n, ost: integer;
  s: string;

begin
  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.
НУК
я тут напутал немного мне надо переводить из тоичной уравновешенной в десятичную, вся запара у меня щас в том что я не магу сделать так что бы -1 при вводи троичного числа тоже считалась, извеняюсь за свою глупость mega_chok.gif
volvo
Смотря как ты вводишь число в (3) системе... Если пользоваться "+-0", то вот так оно переводится в (10):
var
  s: string;
  base, n, i: integer;

begin
  write('s(3) = '); readln(s);

  base := 1; n := 0;
  for i := length(s) downto 1 do begin
    case s[i] of
      '0': ;
      '+': n := n + base;
      '-': n := n - base;

    end;
    base := base * 3;
  end;
  writeln('n(10) = ', n);
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.