1

誰もが数値を10進法から2進法に変換する方法を知っています。私もそうです。誰もが10進数から3つのシステムのベースに変換する方法を知っています。

ただし、10進数を「奇妙な基数3」システムに変換する必要があるという問題があります。このシステムでは、1つの記号を最初の記号にすることはできず、残りの2つで囲む必要があります。したがって、他の2つのシンボルのいずれかが使用される前に、1つのシンボルを繰り返すことはできません。

したがって、「0」が最初の記号ではなく、繰り返すことができない記号である場合、次のようになります。

完全に合法的な番号:120、110202、1020

存在してはならない数値:01212(ゼロを前面に配置してはならない)、120012(ゼロを繰り返すことはできません)

誰かが、10進法からこの「奇妙な基数3」の法則に変換して元に戻すアルゴリズムを考え出すのを手伝ってくれませんか。

前もって感謝します

4

2 に答える 2

0

次は目的のマッピングですか?

   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
于 2010-06-30T12:32:05.967 に答える
0

12月からstrange-3ベースへの@Danielのマッピングに基づく:

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 y = 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;      

必要なのは、特定の数までのすべての不正な表現を見つける関数だけです。

于 2010-06-30T13:49:56.343 に答える