用堆栈实现十进制到十六进制的转化(支持长整型范围内的整数)

1 篇文章 0 订阅
1 篇文章 0 订阅
这篇博客介绍了如何利用堆栈来实现长整型十进制数到十六进制的转换,包括正数和负数的处理。对于负数,先转换为正数,然后取反加一,并处理进位问题。代码示例展示了整个转换过程,支持在-2^31+1到2^31-1之间的整数转换。
摘要由CSDN通过智能技术生成

用堆栈实现十进制到十六进制的转化(支持长整型范围内的整数)

这个东西的实现主要分两个部分:正数部分负数部分 (小数部分)要取整比较麻烦就没做,正数部分比较简单,十六进一;负数部分则略微麻烦一些,因为负数转要先对其对应正数各位取反然后加一,同时也要考虑进位的问题,代码在下面。
(个人拙作,如有错误,请多见谅)

主要思路:
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();
	}
}

输出结果如下:

正数
正数
负数
负数
长整型
长整型范围

差不多就是这样,那么就先到这里。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值