基础b扩展n算法

时间:2013-02-11 00:40:02

标签: algorithm math discrete-mathematics

我正在阅读关于n算法的基础扩展,这本书真的很难阅读和理解,我不确定底部是什么意思......

enter image description here

它返回n还是什么?你会怎么做...谢谢

some method (n,b)
if b == 0
    return 1
q = n
k = 0
while q does not == 0
    a[k] = q % b
    q = q / b
    k = k + 1
    return ???

2 个答案:

答案 0 :(得分:0)

这个算法背后的想法是它创建一个值列表a k k-1 k-2 , ..., 0 。在最后,它想要返回该值列表,并以一个看起来像数字的base-b表示形式的形式这样做。

例如,如果您在此算法中输入33并要求其基数为16的表示,则算法将设置 1 = 2且 0 = 1。然后算法的返回值是表示21,它是 1 (2),后跟 0 (1)。

他们使用的符号只是用于“返回此算法产生的值列表”的花哨算术。您可以将其视为返回数字的base-b数字数组。

希望这有帮助!

答案 1 :(得分:0)

我在C中为该函数编写了一个实现。它使用指针作为输入参数,其中将放置输出(整数向量)。该函数还返回一个整数 - 向量的逻辑大小。

#include <assert.h>

int toBase(int n, int b, int* answer) {
    assert(b > 1);
    q = n
    k = 0
    while (q != 0) {
        answer[k] = q % b;
        q /= b;
        ++k;
    }
    return k;
}

int main() {
    int answer[32];
    int n = 100000;
    int b = 2;
    int answerSize = toBase(n, b, answer);

    // use answer and answerSize

    return 0;
}

另一种方法(没有指针参数)是为函数内部的向量分配内存并返回它,要求调用函数在完成处理后释放使用过的内存。

在这种情况下,您无法分辨向量的逻辑大小,因此您必须将answer [k]设置为特殊值(此处为-1),以了解向量的结束位置。

#include <assert.h>

int* toBase(int n, int b) {
    assert(b > 1);
    int* answer = malloc(33 * sizeof(int));
    q = n
    k = 0
    while (q != 0) {
        answer[k] = q % b;
        q /= b;
        ++k;
    }
    answer[k] = -1;
    return answer;
}

int main() {
    int n = 100000;
    int b = 2;
    int *answer = toBase(n, b);

    // use answer

    free(answer);
    return 0;
}

更优雅的解决方案(在C ++中)是使用STL向量类。