用堆栈实现十进制到十六进制的转化(支持长整型范围内的整数)
这个东西的实现主要分两个部分:正数部分和负数部分 (小数部分)要取整比较麻烦就没做,正数部分比较简单,十六进一;负数部分则略微麻烦一些,因为负数转要先对其对应正数各位取反然后加一,同时也要考虑进位的问题,代码在下面。
(个人拙作,如有错误,请多见谅)
主要思路:
1.十进制转为十六进制,就是每次对十六取余,然后把得到的数压栈。
2.若是负数,则先转为正数,求出对应正数的十六进制后对各位取反,然后加一。
3.各位出栈。
4.输入数据范围为长整型。
#include<iostream>
#include<stack>
using namespace std;
void convertDecToHex(long long x);
int main() {
long long x;
cout << "请输入要转化的数(仅支持在-2^31+1到2^31-1之间的整数)" << endl;
cin >> x;
convertDecToHex(x);
return 0;
}
void convertDecToHex(long long x) {
stack<char>s,t;
char a;
int count = 0;
if (x < 0) {//负数转化
x = -x;//先转化为对应正数
do {//二转十六
if (x % 16 > 9) {
a = 'A' + x % 16 - 10;
}
else {
a = '0' + x % 16;
}
s.push(a);//压
x /= 16;//下一位
count++;//统计位数
} while (count<8);//八位
while(!s.empty()){//将栈中元素逐个取出并取反,如'0'对'F','7'对'8'等
if (s.top()<'5') {
s.top() = 'A' + '5' - s.top();
}
else if(s.top()<':'){//':'为'9'的后一个字符
s.top() = '0' + '?' - s.top();//'?'相当于'9'之后的第六个字符,即所谓的'15'
}
else {
s.top() = '0' + 'F' - s.top();
}
t.push(s.top());//压入另一个栈中暂时储存
s.pop();
}
//将新栈栈顶,也就是旧栈栈底,即输出的八位数的最左一位加一
if (t.top() == 9)t.top() = 'A';
else t.top()++;
//满十六进位
while(t.top() > 'F') {
t.top() = '0';
s.push(t.top());
t.pop();
t.top()++;
}
//把各位数压回旧栈
while (!t.empty()) {
s.push(t.top());
t.pop();
}
}
else {//正数二转十六
do {
if (x % 16 > 9) {//10到15
a = 'A' + x % 16 - 10;
}
else {//0到9
a = '0' + x % 16;
}
s.push(a);//压
x /= 16;//下一位
count++;
} while (count<8);
}
cout << "0x";//十六进制前缀
//输出
while (!s.empty()) {
cout << s.top();
s.pop();
}
}
输出结果如下:
正数
负数
长整型
差不多就是这样,那么就先到这里。