您的当前位置:首页正文

C语言丨数制转换

2024-12-01 来源:个人技术集锦

除j取余法的数学原理如下:

其中j表示进位制的大小。并且,N = (N / j) * j + N % j(/为整除,%为求余)。

结合栈的知识(详见、),我们将十进制数每次除以j,所得的余数依次进栈,然后按“后进先出”的次序便得到转换的结果。这就需要用到循环。以下是算法的核心思想:

(1)若N != 0,则将N%j取得的余数压入栈s中,执行步骤(2);若N = 0,将栈s的内容依次出栈,算法结束。

(2)用N / j代替N。

(3)当N > 0,则重复步骤(1)、(2)。

下面我们以一个具体问题来展示以下算法的实现:将十进制数转换为八进制数。


void Conversion()/*将十进制数转换为八进制数*/
{
    int x;
    Stack *Dstack;
    Dstack = InitStack();
    scanf("%d", &x);
    while(x != 0)
    {
        Push(Dstack, x % 8);/*进栈次序是个位、十位……*/
        x = x / 8;
    }
    ShowStack(Dstack);
}

以上代码是用顺序栈实现的,若用链栈实现,对代码稍加修改即可:

void Conversion()/*将十进制数转换为八进制数*/
{
    int x;
    scanf("%d", &x);
    Node *top;
    top = (Node *)malloc(sizeof(Node));
    top->data = x % 8;
    top->link = NULL;
    x = x / 8;
    while(x != 0)
    {
        Push(top, x % 8);/*进栈次序是个位、十位……*/
        x = x / 8;
    }
    ShowStack(top);
}

 数制转换的核心就是利用栈“后进先出”的特性,实现转换后数字的输出。


参考文献:

文益民 张瑞霞 李健 编著,数据结构与算法(第2版),清华大学出版社,P47-48.

显示全文