c++二,八,十,十六进制的互相转换(包括小数,负数,且保留小数点后六位)

关于本文章内容说明

文章基本只是将作者本人编写的代码进行复制粘贴,而这份代码是作者大一上学期期末作业,若有不足之处,还请见谅。原因主要还是快到期末了,不想写代码,想着“借鉴”网上大佬们的代码,但是没找到合适的,于是自己就写一份吧。

进制间的转换思想

因为十进制的方便,所以利用十进制作为中间桥梁进行进制之间的转换。对于浮点数进行整数部分与小数部分的分离来计算,并在最后相加。

功能目的

1.各进制数字符串转换为十进制正数值;
2.分离十进制数值的整数和小数部分;
3.对分离出的整数、小数部分分别做转换,将其转换为目标进制;
4将转换好的整数、小数部分以及符号位拼接为字符串输出。

代码实现

菜单项的实现

构建一级菜单,利用循环构建,并且调用二级菜单

void menu()
{
	int n = -1;
	while (n != 0)
	{
		cout << "\n**********************";
		cout << "\n(1)2进制数转换";
		cout << "\n(2)8进制数转换";
		cout << "\n(3)10进制数转换";
		cout << "\n(4)16进制数转换";
		cout << "\n(0)退出";
		cout << "\n**********************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>4)
		{
			cout << "\n输入错误,请重新输入功能号:";
			cin >> n;
		}
		if (n == 1)
			two_menu_1();
		else if (n == 2)
			two_menu_2();
		else if (n == 3)
			two_menu_3();
		else if (n == 4)
			two_menu_4();
		else return;
	}
}

构建二级菜单,并且能够返回上一级菜单,共有四个分别对应(二进制,八进制,十进制,十六进制)

void two_menu_1()
{
	int n = -1;
	string x;
	while (n != 0)
	{
		cout << "\n*******************************";
		cout << "\n(1)2进制数  --->  8进制数";
		cout << "\n(2)2进制数  --->  10进制数";
		cout << "\n(3)2进制数  --->  16进制数";
		cout << "\n(0)返回上级目录";
		cout << "\n*******************************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>3)
		{
			cout << "\n输入错误,请重新输入功能号:";
			cin >> n;
		}
		if (n == 1)
		{
			cout << "\n请输入2进制数:";
			cin >> x;
			ndec(2, x);
			decn(x, 8);
			cout << "\n8进制数为:" << x;
		}
		else if (n == 2)
		{
			cout << "\n请输入2进制数:";
			cin >> x;
			ndec(2, x);
			cout << "\n10进制数为:" << x;
		}
		else if (n == 3)
		{
			cout << "\n请输入2进制数:";
			cin >> x;
			ndec(2, x);
			decn(x, 16);
			cout << "\n16进制数为:" << x;
		}
		else menu();
	}
}//第一个子菜单
void two_menu_2()
{
	int n = -1;
	string x;
	while (n != 0)
	{
		cout << "\n*******************************";
		cout << "\n(1)8进制数  --->  2进制数";
		cout << "\n(2)8进制数  --->  10进制数";
		cout << "\n(3)8进制数  --->  16进制数";
		cout << "\n(0)返回上级目录";
		cout << "\n*******************************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>3)
		{
			cout << "";
			cin >> n;
		}
		if (n == 1)
		{
			cout << "请输入8进制数:";
			cin >> x;
			ndec(8, x);
			decn(x, 2);
			cout << "\n2进制数为:" << x;
		}
		else if (n == 2)
		{
			cout << "请输入8进制数:";
			cin >> x;
			ndec(8, x);
			cout << "\n10进制数为:" << x;
		}
		else if (n == 3)
		{
			cout << "请输入8进制数:";
			cin >> x;
			ndec(8, x);
			decn(x, 16);
			cout << "\n16进制数为:" << x << endl;
		}
		else menu();
	}
}
void two_menu_3()
{
	int n = -1;
	string x;
	while (n != 0)
	{
		cout << "\n*******************************";
		cout << "\n(1)10进制数  --->  2进制数";
		cout << "\n(2)10进制数  --->  8进制数";
		cout << "\n(3)10进制数  --->  16进制数";
		cout << "\n(0)返回上级目录";
		cout << "\n*******************************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>3)
		{
			cout << "\n输入错误,请重新输入功能号:";
			cin >> n;
		}
		if (n == 1)
		{
			cout << "\n请输入10进制数:";
			cin >> x;
			decn(x, 2);
			cout << "\n2进制数为:" << x;
		}
		else if (n == 2)
		{
			cout << "\n请输入10进制数:";
			cin >> x;
			decn(x, 8);
			cout << "\n8进制数为:" << x;
		}
		else if (n == 3)
		{
			cout << "\n请输入10进制数:";
			cin >> x;
			decn(x, 16);
			cout << "\n16进制数为:" << x;
		}
		else menu();
	}
}
void two_menu_4()
{
	int n = -1;
	string x;
	while (n != 0) {
		cout << "\n*******************************";
		cout << "\n(1)16进制数  --->  2进制数";
		cout << "\n(2)16进制数  --->  8进制数";
		cout << "\n(3)16进制数  --->  10进制数";
		cout << "\n(0)返回上级目录";
		cout << "\n*******************************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>3)
		{
			cout << "\n输入错误,请重新输入功能号:";
			cin >> n;
		}
		if (n == 1)
		{
			cout << "\n请输入16进制数:";
			cin >> x;
			ndec(16, x);
			decn(x, 2);
			cout << "\n2进制数为:" << x;
		}
		else if (n == 2)
		{
			cout << "\n请输入16进制数:";
			cin >> x;
			ndec(16, x);
			decn(x, 8);
			cout << "\n8进制数为:" << x;
		}
		else if (n == 3)
		{
			cout << "\n请输入16进制数:";
			cin >> x;
			ndec(16, x);
			cout << "\n10进制数为:" << x;
		}
		else menu();
	}
}

非法性判断

注意小数点的个数,不符合进制要求的数字或字符。
n为进制,x为输入的进制数,sign为正负,point为小数点个数。(可以用do while进行化简)

int legal(int n, string& x,int sign)
{
	unsigned int point = 0, illegal = 0,i;
	if (x[0] == '-')
		sign++;
	for (i = 0 + sign; i < x.length(); i++)
	{
		if (x[i] == '.')
		{
			point++;
			continue;
		}
		if (x[i] < '0' || x[i] >= n + '0')
			illegal++;
		if(n==16&&(x[i]>='A'||x[i]<='F'))
			continue;
	}
	while (point >= 2 || illegal > 0)
	{
		cout << "输入错误,请重新输入:";
		cin >> x;
		sign = 0;
		if (x[0] == '-')
			sign++;
		point = 0, illegal = 0;
		for (i = 0 + sign; i < x.size(); i++)
		{
			if (x[i] == '.')
			{
				point++;
				continue;
			}
			if (x[i] < '0' || x[i]>n + '0')
				illegal++;
			if (n == 16 && (x[i] >= 'A' || x[i] <= 'F'))
				continue;
		}
	}
	return point;
}

其他进制转换为十进制

void ndec(int  n, string& x)
{
	unsigned int whole_n = 0, i, j, k, point = 0, sign = 0, num = 1, whole = 0, small_n = 0, wn = 1, sn = 0, control_small = 0;//whole为整数部分,whole_n为整数位数(若为负数不会加一)
	double small = 0, new_num;
	if (x[0] == '-')
		sign++;
	point=legal(n, x, sign);
	if (point == 1)
	{
		for (i = 0 + sign; i < x.size(); i++, whole_n++)
			if (x[i] == '.')
				break;
		for (i = i + 1; i < x.size(); i++)
			small_n++;
		for (j = 0 + sign; j < whole_n + sign; j++)
		{
			num = 1;
			for (k = 0; k < whole_n + sign - j - 1; k++)
				num = num * n;
			if (x[j] >= 'A' && x[j] <= 'F')
				whole = whole + (int(x[j]) - 55) * num;
			else whole = whole + (int(x[j]) - 48) * num;
		}
		for (control_small = 0, j = j + 1; j < x.size(); j++)
		{
			if (control_small >= 6)
				break;
			num = 1;
			for (k = 0; k < j - whole_n - sign; k++)
				num = num * n;
			if (x[j] >= 'A' && x[j] <= 'F')
				small = small + (int(x[j]) - double(55)) / num;
			else small = small + (int(x[j]) - double(48)) / num;
			control_small++;
		}
	}
	else
	{
		for (i = 0 + sign; i < x.size(); i++)
			whole_n++;
		for (i = 0 + sign; i < x.size() + sign; i++)
		{
			num = 1;
			for (k = 0; k < x.size() - i - 1; k++)
				num = num * n;
			if (x[i] >= 'A' && x[i] <= 'F')
				whole = whole + (int(x[i]) - 55) * num;
			else whole = whole + (int(x[i]) - 48) * num;
		}
	}
	new_num = whole + small;
	double t = new_num;//以下是将数字转化为字符串
	x = "";
	if (sign)
		x += '-';
	while (int(t) / 10 != 0)
	{
		wn++;
		t = t / 10;
	}
	t = new_num;
	if (point)
	{
		while (t * 10 != (int(t)) * double(10))
		{
			sn++;
			t = t * 10;
		}
	}
	t = new_num;
	for (i = 0 + sign; i < wn + sign; i++)
	{
		num = 1;
		for (k = 0; k < wn + sign - i - 1; k++)
			num = num * 10;
		x += int(t / num) + '0';
		t = int(t) % num;
	}
	if (point)
	{
		x += '.';
		t = new_num;
		for (i = 0; i < sn; i++)
		{
			x += int((t - int(t)) * 10) + '0';
			t = t * 10;
		}
	}
}

十进制转换为其他进制

void decn(string& x, int n)
{
	unsigned int whole_n = 0, small_n = 0, i, j, point = 0, sign = 0, whole = 0, control_small;
	double small = 0, new_num, t;
	if (x[0] == '-')
		sign++;
	point = legal(10, x, sign);
	for (i = 0 + sign; i < x.size(); i++)
	{
		if (x[i] == '.')
			break;
		whole *= 10;
		whole = whole + int(x[i] - '0');
	}
	for (j = x.size() - 1; j > i; j--)
	{
		small = small + x[j] - '0';
		small = small / 10;
	}
	new_num = whole + small;
	x = "";
	if (sign)
		x = "-";
	fun_1(whole, x, n);
	t = small;
	if (point)
	{
		x += '.';
		control_small = 0;
		while (control_small < 5 && int(t * n) != t * n)
		{
			if (t * n >= 10)
				x = x + char(int(t * n) + 55);
			else
				x = x + char(int(t * n) + 48);
			t = t * n - int(t * n);
			control_small++;
		}
		if (t * n >= 10)
			x = x + char(int(t * n) + 55);
		else
			x = x + char(int(t * n) + 48);
	}
}
void fun_1(int i, string& x, int n)
{
	if (i >= n)
	{
		fun_1(i / n, x, n);
		if (i >= 10)
			x = x + char(i % n + 55);
		else
			x = x + char(i % n + 48);
	}
	else
	{
		if (i >= 10)
			x = x + char(i + 55);
		else
			x = x + char(i + 48);
	}
}

全部代码

#include<string>
#include <iostream>
#include<iomanip>
using namespace std;
void menu();
void two_menu_1();
void two_menu_2();
void two_menu_3();
void two_menu_4();
void ndec(int, string&);
void decn(string&, int);
void fun_1(int, string&, int);
int legal(int, string&,int);


int main()
{
	menu();
	return 0;
}


void menu()
{
	int n = -1;
	while (n != 0)
	{
		cout << "\n**********************";
		cout << "\n(1)2进制数转换";
		cout << "\n(2)8进制数转换";
		cout << "\n(3)10进制数转换";
		cout << "\n(4)16进制数转换";
		cout << "\n(0)退出";
		cout << "\n**********************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>4)
		{
			cout << "\n输入错误,请重新输入功能号:";
			cin >> n;
		}
		if (n == 1)
			two_menu_1();
		else if (n == 2)
			two_menu_2();
		else if (n == 3)
			two_menu_3();
		else if (n == 4)
			two_menu_4();
		else return;
	}
}//主菜单的实现
void two_menu_1()
{
	int n = -1;
	string x;
	while (n != 0)
	{
		cout << "\n*******************************";
		cout << "\n(1)2进制数  --->  8进制数";
		cout << "\n(2)2进制数  --->  10进制数";
		cout << "\n(3)2进制数  --->  16进制数";
		cout << "\n(0)返回上级目录";
		cout << "\n*******************************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>3)
		{
			cout << "\n输入错误,请重新输入功能号:";
			cin >> n;
		}
		if (n == 1)
		{
			cout << "\n请输入2进制数:";
			cin >> x;
			ndec(2, x);
			decn(x, 8);
			cout << "\n8进制数为:" << x;
		}
		else if (n == 2)
		{
			cout << "\n请输入2进制数:";
			cin >> x;
			ndec(2, x);
			cout << "\n10进制数为:" << x;
		}
		else if (n == 3)
		{
			cout << "\n请输入2进制数:";
			cin >> x;
			ndec(2, x);
			decn(x, 16);
			cout << "\n16进制数为:" << x;
		}
		else menu();
	}
}//第一个子菜单
void two_menu_2()
{
	int n = -1;
	string x;
	while (n != 0)
	{
		cout << "\n*******************************";
		cout << "\n(1)8进制数  --->  2进制数";
		cout << "\n(2)8进制数  --->  10进制数";
		cout << "\n(3)8进制数  --->  16进制数";
		cout << "\n(0)返回上级目录";
		cout << "\n*******************************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>3)
		{
			cout << "";
			cin >> n;
		}
		if (n == 1)
		{
			cout << "请输入8进制数:";
			cin >> x;
			ndec(8, x);
			decn(x, 2);
			cout << "\n2进制数为:" << x;
		}
		else if (n == 2)
		{
			cout << "请输入8进制数:";
			cin >> x;
			ndec(8, x);
			cout << "\n10进制数为:" << x;
		}
		else if (n == 3)
		{
			cout << "请输入8进制数:";
			cin >> x;
			ndec(8, x);
			decn(x, 16);
			cout << "\n16进制数为:" << x << endl;
		}
		else menu();
	}
}
void two_menu_3()
{
	int n = -1;
	string x;
	while (n != 0)
	{
		cout << "\n*******************************";
		cout << "\n(1)10进制数  --->  2进制数";
		cout << "\n(2)10进制数  --->  8进制数";
		cout << "\n(3)10进制数  --->  16进制数";
		cout << "\n(0)返回上级目录";
		cout << "\n*******************************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>3)
		{
			cout << "\n输入错误,请重新输入功能号:";
			cin >> n;
		}
		if (n == 1)
		{
			cout << "\n请输入10进制数:";
			cin >> x;
			decn(x, 2);
			cout << "\n2进制数为:" << x;
		}
		else if (n == 2)
		{
			cout << "\n请输入10进制数:";
			cin >> x;
			decn(x, 8);
			cout << "\n8进制数为:" << x;
		}
		else if (n == 3)
		{
			cout << "\n请输入10进制数:";
			cin >> x;
			decn(x, 16);
			cout << "\n16进制数为:" << x;
		}
		else menu();
	}
}
void two_menu_4()
{
	int n = -1;
	string x;
	while (n != 0) {
		cout << "\n*******************************";
		cout << "\n(1)16进制数  --->  2进制数";
		cout << "\n(2)16进制数  --->  8进制数";
		cout << "\n(3)16进制数  --->  10进制数";
		cout << "\n(0)返回上级目录";
		cout << "\n*******************************";
		cout << "\n请输入功能号:";
		cin >> n;
		while (n < 0 || n>3)
		{
			cout << "\n输入错误,请重新输入功能号:";
			cin >> n;
		}
		if (n == 1)
		{
			cout << "\n请输入16进制数:";
			cin >> x;
			ndec(16, x);
			decn(x, 2);
			cout << "\n2进制数为:" << x;
		}
		else if (n == 2)
		{
			cout << "\n请输入16进制数:";
			cin >> x;
			ndec(16, x);
			decn(x, 8);
			cout << "\n8进制数为:" << x;
		}
		else if (n == 3)
		{
			cout << "\n请输入16进制数:";
			cin >> x;
			ndec(16, x);
			cout << "\n10进制数为:" << x;
		}
		else menu();
	}
}

void ndec(int  n, string& x)
{
	unsigned int whole_n = 0, i, j, k, point = 0, sign = 0, num = 1, whole = 0, small_n = 0, wn = 1, sn = 0, control_small = 0;//whole为整数部分,whole_n为整数位数(若为负数不会加一)
	double small = 0, new_num;
	if (x[0] == '-')
		sign++;
	point=legal(n, x, sign);
	if (point == 1)
	{
		for (i = 0 + sign; i < x.size(); i++, whole_n++)
			if (x[i] == '.')
				break;
		for (i = i + 1; i < x.size(); i++)
			small_n++;
		for (j = 0 + sign; j < whole_n + sign; j++)
		{
			num = 1;
			for (k = 0; k < whole_n + sign - j - 1; k++)
				num = num * n;
			if (x[j] >= 'A' && x[j] <= 'F')
				whole = whole + (int(x[j]) - 55) * num;
			else whole = whole + (int(x[j]) - 48) * num;
		}
		for (control_small = 0, j = j + 1; j < x.size(); j++)
		{
			if (control_small >= 6)
				break;
			num = 1;
			for (k = 0; k < j - whole_n - sign; k++)
				num = num * n;
			if (x[j] >= 'A' && x[j] <= 'F')
				small = small + (int(x[j]) - double(55)) / num;
			else small = small + (int(x[j]) - double(48)) / num;
			control_small++;
		}
	}
	else
	{
		for (i = 0 + sign; i < x.size(); i++)
			whole_n++;
		for (i = 0 + sign; i < x.size() + sign; i++)
		{
			num = 1;
			for (k = 0; k < x.size() - i - 1; k++)
				num = num * n;
			if (x[i] >= 'A' && x[i] <= 'F')
				whole = whole + (int(x[i]) - 55) * num;
			else whole = whole + (int(x[i]) - 48) * num;
		}
	}
	new_num = whole + small;
	double t = new_num;//以下是将数字转化为字符串
	x = "";
	if (sign)
		x += '-';
	while (int(t) / 10 != 0)
	{
		wn++;
		t = t / 10;
	}
	t = new_num;
	if (point)
	{
		while (t * 10 != (int(t)) * double(10))
		{
			sn++;
			t = t * 10;
		}
	}
	t = new_num;
	for (i = 0 + sign; i < wn + sign; i++)
	{
		num = 1;
		for (k = 0; k < wn + sign - i - 1; k++)
			num = num * 10;
		x += int(t / num) + '0';
		t = int(t) % num;
	}
	if (point)
	{
		x += '.';
		t = new_num;
		for (i = 0; i < sn; i++)
		{
			x += int((t - int(t)) * 10) + '0';
			t = t * 10;
		}
	}
}
void decn(string& x, int n)
{
	unsigned int whole_n = 0, small_n = 0, i, j, point = 0, sign = 0, whole = 0, control_small;
	double small = 0, new_num, t;
	if (x[0] == '-')
		sign++;
	point = legal(10, x, sign);
	for (i = 0 + sign; i < x.size(); i++)
	{
		if (x[i] == '.')
			break;
		whole *= 10;
		whole = whole + int(x[i] - '0');
	}
	for (j = x.size() - 1; j > i; j--)
	{
		small = small + x[j] - '0';
		small = small / 10;
	}
	new_num = whole + small;
	x = "";
	if (sign)
		x = "-";
	fun_1(whole, x, n);
	t = small;
	if (point)
	{
		x += '.';
		control_small = 0;
		while (control_small < 5 && int(t * n) != t * n)
		{
			if (t * n >= 10)
				x = x + char(int(t * n) + 55);
			else
				x = x + char(int(t * n) + 48);
			t = t * n - int(t * n);
			control_small++;
		}
		if (t * n >= 10)
			x = x + char(int(t * n) + 55);
		else
			x = x + char(int(t * n) + 48);
	}
}

void fun_1(int i, string& x, int n)
{
	if (i >= n)
	{
		fun_1(i / n, x, n);
		if (i >= 10)
			x = x + char(i % n + 55);
		else
			x = x + char(i % n + 48);
	}
	else
	{
		if (i >= 10)
			x = x + char(i + 55);
		else
			x = x + char(i + 48);
	}
}
int legal(int n, string& x,int sign)
{
	unsigned int point = 0, illegal = 0,i;
	if (x[0] == '-')
		sign++;
	for (i = 0 + sign; i < x.length(); i++)
	{
		if (x[i] == '.')
		{
			point++;
			continue;
		}
		if (x[i] < '0' || x[i] >= n + '0')
			illegal++;
		if(n==16&&(x[i]>='A'||x[i]<='F'))
			continue;
	}
	while (point >= 2 || illegal > 0)
	{
		cout << "输入错误,请重新输入:";
		cin >> x;
		sign = 0;
		if (x[0] == '-')
			sign++;
		point = 0, illegal = 0;
		for (i = 0 + sign; i < x.size(); i++)
		{
			if (x[i] == '.')
			{
				point++;
				continue;
			}
			if (x[i] < '0' || x[i]>n + '0')
				illegal++;
			if (n == 16 && (x[i] >= 'A' || x[i] <= 'F'))
				continue;
		}
	}
	return point;
}



  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是将五、十六进制浮点数化成进制浮点数的C++代码: ```c++ #include <iostream> #include <cmath> using namespace std; // 将五、十六进制浮点数化成进制浮点数 double hexToDec(string hex) { int len = hex.length(); double result = 0.0; int pointIndex = -1; // 记录小数点位置 int expIndex = -1; // 记录指数位置 int expSign = 1; // 记录指数符号 int expValue = 0; // 记录指数值 bool isNegative = false; // 是否为负数 // 判断是否为负数 if (hex[0] == '-') { isNegative = true; hex = hex.substr(1); len--; } // 判断是否为科学计数法 for (int i = 0; i < len; i++) { if (hex[i] == 'p' || hex[i] == 'P') { expIndex = i; break; } else if (hex[i] == '.') { pointIndex = i; } } // 计算指数值 if (expIndex != -1) { if (hex[expIndex + 1] == '-') { expSign = -1; expValue = stoi(hex.substr(expIndex + 2)); } else { expValue = stoi(hex.substr(expIndex + 1)); } } // 计算整数部分 if (pointIndex == -1) { // 没有小数 for (int i = 0; i < len; i++) { if (hex[i] >= '0' && hex[i] <= '9') { result += (hex[i] - '0') * pow(16, len - i - 1); } else if (hex[i] >= 'A' && hex[i] <= 'F') { result += (hex[i] - 'A' + 10) * pow(16, len - i - 1); } else if (hex[i] >= 'a' && hex[i] <= 'f') { result += (hex[i] - 'a' + 10) * pow(16, len - i - 1); } } } else { // 有小数 for (int i = 0; i < pointIndex; i++) { if (hex[i] >= '0' && hex[i] <= '9') { result += (hex[i] - '0') * pow(16, pointIndex - i - 1); } else if (hex[i] >= 'A' && hex[i] <= 'F') { result += (hex[i] - 'A' + 10) * pow(16, pointIndex - i - 1); } else if (hex[i] >= 'a' && hex[i] <= 'f') { result += (hex[i] - 'a' + 10) * pow(16, pointIndex - i - 1); } } for (int i = pointIndex + 1; i < len; i++) { if (hex[i] >= '0' && hex[i] <= '9') { result += (hex[i] - '0') * pow(16, pointIndex - i); } else if (hex[i] >= 'A' && hex[i] <= 'F') { result += (hex[i] - 'A' + 10) * pow(16, pointIndex - i); } else if (hex[i] >= 'a' && hex[i] <= 'f') { result += (hex[i] - 'a' + 10) * pow(16, pointIndex - i); } } } // 计算指数部分 if (expIndex != -1) { result *= pow(2, expValue * expSign); } // 判断是否为负数 if (isNegative) { result = -result; } return result; } // 测试代码 int main() { string hex1 = "0x3.14p3"; string hex2 = "-0x8.b7p1"; string hex3 = "0x1Cp0"; string hex4 = "-0x1F.2p-2"; double dec1 = hexToDec(hex1); double dec2 = hexToDec(hex2); double dec3 = hexToDec(hex3); double dec4 = hexToDec(hex4); cout << hex1 << " -> " << dec1 << endl; cout << hex2 << " -> " << dec2 << endl; cout << hex3 << " -> " << dec3 << endl; cout << hex4 << " -> " << dec4 << endl; return 0; } ``` 上述代码的算法思路如下: 1. 判断是否为负数,如果是,将号去掉,并标记为负数。 2. 判断是否为科学计数法,如果是,记录指数位置,并计算指数值。 3. 根据小数点位置,将整数部分和小数部分分别计算。 4. 如果有指数部分,根据指数符号和指数值,计算出指数部分的值。 5. 如果原数为负数,将计算得到的结果取相反数。 对于计算十六进制数的整数部分和小数部分,可以根据每一位上的数字,乘以16的相应次方,然后相加得到结果。对于计算指数部分,可以根据指数符号和指数值,计算2的相应次方,然后将结果乘以整数部分和小数部分的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值