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

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

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

> перевод из 10 с.с. в троичную уравновешенную, можно ли короче это сделать?
/7popok
сообщение 11.02.2007 20:14
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской
Реальное имя: Игорь

Репутация: -  0  +


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


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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
/7popok
сообщение 11.02.2007 20:27
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской
Реальное имя: Игорь

Репутация: -  0  +


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

Сообщение отредактировано: /7popok - 11.02.2007 20:28
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hardcase
сообщение 11.02.2007 21:19
Сообщение #3


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Цитата(/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.



--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



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