Десятичное к основанию трех систем с завихрением - PullRequest
1 голос
/ 30 июня 2010

Каждый знает, как преобразовать число из десятичной системы в двоичную. Я тоже Все также знают, как преобразовать десятичную систему в основную систему из трех.

Однако у меня есть проблема, когда мне нужно преобразовать десятичное число в "странную базу 3", где один символ не может быть первым и должен быть окружен оставшимися двумя. Таким образом, один символ не может быть повторен до того, как будет использован один из двух других.

Итак, если «0» - это символ, который не может быть первым и не может повторяться:

совершенно законные номера: 120, 110202, 1020

номеров, которые не должны существовать: 01212 (ноль не должен быть впереди), 120012 (нули не могут повторяться)

Может кто-нибудь, пожалуйста, помогите придумать алгоритм, который преобразует десятичную систему в эту "странную базу 3" и обратно.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 30 июня 2010

На основе отображения @ Даниэля, от декабря до странного-3:

x := n; // Original number
y:= 0;
do
  y0:= y;
  z:= DecToThree(x); // Convert x from Decimal to 3-based.
  y:= IllRep(z);     // Calculate the number y of numbers with at least 2 
                     // consecutive 0 with a representation in 3- based.
  x:= n + y;        // Add illegal representations to original number;
until (y = y0);
Result:= DezToThree(x); // Convert x from Decimal to 3-based. 

Пример:

16 -> 121 y = 2 // {0,100}

16 + 2 -> 200 лет = 3 // {0, 100, 200}

16 + 3-2 -> 201 года = 3

И наоборот:

y:= IllRep(x);     // calculate the number y of illegal representations
z:= ThreeToDec(x); // convert x from 3-based to dec 
result:= z-y;      

Теперь все, что вам нужно, - это функция, которая находит все недопустимые представления вплоть до определенного числа.

0 голосов
/ 30 июня 2010

Требуется ли следующее отображение?

   0 <- illegal
   1               0
   2               1
  10               2
  11               3
  12               4
  20               5
  21               6
  22               7
 100 <- illegal                             
 101               8
 102               9
 110              10
 111              11
 112              12
 120              13
 121              14
 122              15
 200 <- illegal
 201              16
 202              17
 210              18
 211              19
 212              20
 220              21
 221              22
 222              23
1000 <- illegal
1001 <- illegal
1002 <- illegal
1010              24
1011              25
1012              26
1020              27
1021              28
1022              29
1100 <- illegal                             
1101              30
1102              31
1110              32
1111              33
1112              34
1120              35
1121              36
1122              37
1200 <- illegal
1201              38
1202              39
1210              40
1211              41
1212              42
1220              43
1221              44
1222              45
2000 <- illegal
...