Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод числа в симметричную систему счисления 
:(
    Опции темы
ТарасАтавин
Дата 29.8.2013, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Например, в симметричную троичную. Просто в тоичную не проблема: собрать остатки от деления на основание и всё. А в симметричную как? Там цифры -1, 0 и +1, остаток же отрицательным не бывает. Да и деление переводимого числа не очень помогает: например, число 55 в троичной систем будет 2001, а в симметричной троичной  +-00+, что на один знак длиннее.


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bsa
Дата 29.8.2013, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(ТарасАтавин @  29.8.2013,  10:10 Найти цитируемый пост)
число 55 в троичной систем будет 2001, а в симметричной троичной  +-00+, что на один знак длиннее. 

На сколько я понял, надо штатно перевести в троичную, затем поменять 2 на - и 1 на +:
http://ru.wikipedia.org/wiki/%D0%A2%D1%80%....BD.D1.83.D1.8E
PM   Вверх
ТарасАтавин
Дата 29.8.2013, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(bsa @  29.8.2013,  18:16 Найти цитируемый пост)
На сколько я понял, надо штатно перевести в троичную, затем поменять 2 на - и 1 на +:
Нет. Простая подмена символа не меняет систему счисления. В троичной асимметричной 55 десятичное соответствует четырёхзначному числу, а в симметричной троичной пятизначному. Замена не увеличивает разрядность. И если даже менять, то 55 десятичное = 2001 троичное = -00+, а это вообще отрицательное число -26 (минус двадцать шесть).



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
feodorv
Дата 29.8.2013, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Для положительных чисел. Делите число на 3. Если остаток от деления равен 0 или 1, то это 0 или + в симметричной троичной системе счисления. Если же остаток - двойка, то результат деления увеличиваете на единицу, а в соответствующий разряд пишете -. Например: 56(10) = 18[*3] + 2 = 19[*3] + "-" = 6[*3*3] + "+-" = 2[*3*3*3] + "0+-" = 1[*3*3*3*3] + "-0+-" = "+-0+-".

Для отрицательных чисел. Обращаем знак числа, получаем положительное число, которое уже раскладывать умеете. А затем меняете знаки на противоположные.

Как-то так...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ТарасАтавин
Дата 30.8.2013, 04:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Перенос в частное при двойке? Это всегда даст правильный результат? А если в симметричную пятеричную? Тогда перенос единицы в частное при получении тройки и четвёрки, так как в этой системе нет уже двух цифр асимметричной системы с равным основанием?

Это сообщение отредактировал(а) ТарасАтавин - 30.8.2013, 04:56


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
feodorv
Дата 30.8.2013, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(ТарасАтавин @  30.8.2013,  05:54 Найти цитируемый пост)
Это всегда даст правильный результат?

Ну а как Вы думаете?

Цитата(ТарасАтавин @  30.8.2013,  05:54 Найти цитируемый пост)
Тогда перенос единицы в частное при получении тройки и четвёрки

Да. Только 3 в остатке заменяется на "двойной минус", а 4  - на "одинарный минус":
Код

#include <stdio.h>

void toBase( int num, int base, const char *syms)
{
  char buf[128], rbuf[128];
  int orig = num, negative, n = 0, i;

  if( num < 0 )
  {
    negative = 1;
    num = -num;
  }
  else
    negative = 0;

  if( num == 0 )
    buf[n++] = syms[0];
  else
    while( num != 0 )
    {
      int rem = num % base;
      num /= base;

      if( rem > base/2 ) num++;
      if( negative && rem > 0 ) rem = base - rem;

      buf[n++] = syms[rem];
    }

  for( i = 0; i < n; i++) rbuf[i] = buf[n-i-1];
  rbuf[n] = '\0';

  printf( "%d(%d) = %s\n", orig, base, rbuf);
}

#define BASE3 3
const char *syms3 = "0+-";

#define BASE5 5
const char *syms5 = "0+#=-";

int main( void )
{
  int num;
  for( num = -100; num <= 100; num++) toBase( num, BASE3, syms3);
  for( num = -100; num <= 100; num++) toBase( num, BASE5, syms5);
  return 0;
}



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Walterfew
Дата 24.1.2023, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.1.2023

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1273 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.