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

来源:互联网 发布:php画三角形星星 编辑:程序博客网 时间:2024/06/09 18:19

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

进制转换

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

思路解析:

将十进制转换为其他进制的思路为:将十进制数值不断的用其他进制取余,并将余数从低到高排列。
以十进制转二进制为例:要转换的数为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 16void 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;  //释放空间}

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

原创粉丝点击