欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

编程练习之栈篇:进制转换

程序员文章站 2024-03-17 13:25:52
...

编程练习之栈篇:进制转换

进制转换

本篇所讲的进制转换是指:输入一个十进制数字,将十进制的数值转换为二进制、八进制、十六进制,并输出

思路解析:

将十进制转换为其他进制的思路为:将十进制数值不断的用其他进制取余,并将余数从低到高排列。
以十进制转二进制为例:要转换的数为17,对2取余如下:
编程练习之栈篇:进制转换
根据箭头方向,从下到上读取,得出二进制结果为:10001。
上述的计算余数的方式,想必上过小学的朋友都做过吧~。以上计算余数的过程,我们可以简单的整理为以下基本原理:N=( N div d) X d + N mod d (其中,N为十进制数,d为要转换的d进制,div代表整除运算,注意是整除,mod代表取余),我们可以将过程写为以下形式:

N N div 2 N mod 2
17 8 1
8 4 0
4 2 0
2 1 0
1 0 1

现在,我们需要编写一个这样的程序,对于输入的任意非负十进制整数,转换为二进制、八进制、十六进制。通过以上计算我们可以看出,低位总是最先计算出来,最后才是高位数字,而我们写数字的时候,总是从高位到低位,依次写下,与我们的计算过程相反。所以,在这一块为了我们能够比较方便直观的将数据计算并打印出来,我们需要一种先计算出来的数最后才打印的存储方式,而栈恰恰满足了这一点,不要忘记:栈是一种“先进后出”的数据结构,因而,如果我们根据计算过程将计算出来的数字存入栈中,在需要的时候再将栈打印出来,不就正好满足了我们计算进制的需求??(数据结构之栈

代码实现

在这块,我们需要注意的是:十进制转换为二进制和八进制容易,直接用整型数据表示即可,但是,十六进制却是有字符串形式的,因此,在输出中我们需要做特殊的处理才好:
我们提前定义一个满足十六进制的字符数组:char output[] = “0123456789ABCDEF”;在输出时,用该数组替换栈中数据即可。

 //learning C++ by erMao
#include <iostream>
#include <stack>
#include <cstdlib>
using namespace std;
#define BINARY 2
#define OCTONARY 8
#define HEXADECIMAL 16
void changeMod(int num, int mod); //计算进制的函数
int main(){  
    int number;

    cout << "请输入要转换的数字:" << endl;
    cin >> number;
    //将数字转化为2进制
    changeMod(number, BINARY);
    //将数字转化为8进制
    changeMod(number, OCTONARY);
    //将数字转化为16进制
    changeMod(number, HEXADECIMAL);
    return 0;
}

void changeMod(int num, int mod) {
    stack<int> *pt = new stack<int>;  //定义栈指针并分配空间
    char output[] = "0123456789ABCDEF";
    int res = 0;
    while (num != 0)
    {
        res = num % mod;
        pt->push(res);
        num /= mod;
    }

    while (!pt->empty()) {  //遍历输出结果
        cout << output[pt->top()];
        pt->pop();
    }
    cout << endl;

    delete pt;  //释放空间
}

关于栈的介绍点这里:数据结构之栈