编程练习之栈篇:进制转换
编程练习之栈篇:进制转换
进制转换
本篇所讲的进制转换是指:输入一个十进制数字,将十进制的数值转换为二进制、八进制、十六进制,并输出
思路解析:
将十进制转换为其他进制的思路为:将十进制数值不断的用其他进制取余,并将余数从低到高排列。
以十进制转二进制为例:要转换的数为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; //释放空间
}
关于栈的介绍点这里:数据结构之栈
上一篇: HTML5和CSS3权威指南-读书笔记(H5部分)
下一篇: FreeMarker页面静态化