Помощь - Поиск - Пользователи - Календарь
Полная версия: перевод из 10 с.с. в троичную уравновешенную
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
/7popok
это программка перевода из десятичной системы счисления в троичную уравновешенную, но меня смущает её размер. можно ли её реализовать другим путём, чтобы она занимала меньше строк? мне кажется, она должна быть меньше, но я не допираю, куда ещё меньше.


uses crt;
const
     n = 18;
procedure converter(var out:string;x:longint);
var     str3,d: array [1..n] of longint;
          i:integer;
          s:longint;
begin
     clrscr;
     (*Вычисление str3 и d*)
     str3[1]:=1;
     d[1]:=1;
     s:=1;
     for i:=2 to n do
       begin
          str3[i]:=str3[i-1]*3;
	  d[i]:=s+1;
	  s:=s+str3[i];
       end;
     for i:=n downto 1 do
           begin
	 if abs(x)>=d[i] then
	     if x>0 then
                 begin
	          out:=out+'1';
		  x:=x-s3[i];
	     end
                           else
                 begin
	          out:=out+'-1';
		  x:=x+str3[i];
	     end
             else
	      out:= out+'0';
          end;
end;

var     str: string;
          i:integer;
          x: longint;
begin
     clrscr;
     writeln('Введите целое число в десятичной системе счисления [-193710244..193710244]');
     readln(x);
     if (x<-193710244) or (x>193710244) then
          begin
             writeln ('Error');
             readln;
             halt;
          end;
     converter(str,x);
     writeln('Число в троичной уравновешенной системе счисления: ', str);
     readln;
end.

/7popok
до этого не смотрел, но тем не менее тот вариант не работает с отрицательными десятичными числами.
а мой работает. просто подскажите, можно ли его как-нибудь ещё укоротить.
hardcase
Цитата(/7popok @ 11.02.2007 20:27) *
до этого не смотрел, но тем не менее тот вариант не работает с отрицательными десятичными числами.
а мой работает. просто подскажите, можно ли его как-нибудь ещё укоротить.

Цитата

изменение знака числа на противоположный осуществляется простой заменой всех 1 на 1 и наоборот

тот же код, что привёл volvo, но добавлена проверка на отрицательность. good.gif
Код
var
  n, ost: integer;
  s: string;

plus: string;
plusminus: string;

begin
  write('n = '); readln(n);

  if n >= 0 then begin
     plus := '+';
     plusminus := '+-';
  end else begin
     plus := '-';
      plusminus := '-+';
     n := -n;
  end;

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

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

    n := n div 3;
  end;

  case n of
    0: s := '0' + s;
    1: s := plus + s;
    2: s := plusminus + s;
  end;
  writeln('s(3) = ', s);
end.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.