将数字转换为特殊基础系统

时间:2013-11-17 04:18:17

标签: algorithm converter base

我想将基数为10的数字转换为特殊的基本形式,如下所示:

A * 2 ^ 2 + B * 3 ^ 1 + C * 2 ^ 0

A可以取值[0,1]

B可以取值[0,1,2]

C可以取值[0,1]

例如,数字8将是

1 * 2 ^ 2 + 1 * 3 + 1。

保证给定的数字可以转换为这个专门的基础系统。

我知道如何从这个基本系统转换回base-10,但我不知道如何从base-10转换为这个专用基础系统。

2 个答案:

答案 0 :(得分:1)

简化您的“特殊基础”:

X = A * 4 + B * 3 + C
A E {0,1}
B E {0,1,2}
C E {0,1}

显然,可以表示的最大数字是4 + 2 * 3 + 1 = 11

要弄清楚如何获得A,B,C的值,你可以做以下两件事之一:

  1. 只有12种可能的输入:创建查找表。丑陋,但很快。
  2. 使用一些算法。有点棘手。
  3. 让我们先看看(1):

    A B C X. 0 0 0 0 0 0 1 1 0 1 0 3 0 1 1 4 0 2 0 6 0 2 1 7 1 0 0 4 1 0 1 5 1 1 0 7 1 1 1 8 1 2 0 10 1 2 1 11

    请注意,29无法在此系统中表达,而47会出现两次。事实上,对于给定的输入,您有多个可能的解决方案,这是一个暗示,没有一个非常强大的算法(除了查找表)来实现您想要的。所以你的表可能如下所示:

    int A[] = {0,0,-1,0,0,1,0,1,1,-1,1,1};
    int B[] = {0,0,-1,1,1,0,2,1,1,-1,2,2};
    int C[] = {0,1,-1,0,2,1,0,1,1,-1,0,1};
    

    然后查找A,B,C。如果A< 0,没有解决方案。

答案 1 :(得分:1)

简而言之,将每个基数(在您的示例中为2 ^ 2,3 ^ 1,2 ^ 0)视为项目的权重,将整数视为行李的容量。这个问题希望我们找到这些项目的组合,他们准确地填充了这个项目。

首先,这个问题是NP完全的。它与subset sum problem相同,也可以看作knapsack problem的衍生问题。

尽管如此,这个问题可以通过在O(nW)时间内使用动态编程的伪多项式时间算法来解决,n是基数,W是要分解的数字。详细信息可在此维基百科页面中找到:http://en.wikipedia.org/wiki/Knapsack_problem#Dynamic_programming和此SO页面:What's it called when I want to choose items to fill container as full as possible - and what algorithm should I use?