(wa待对拍)HDU - 2057 十六进制加法 难度:C++入门 复杂度:有点复杂 翻译难度:简单...

本文介绍了一个解决十六进制数加法的问题,通过将十六进制转换为十进制进行加法运算,再将结果转换回十六进制。文章提供了一段C++代码实现,包括十六进制到十进制的转换函数、十进制到十六进制的转换函数以及主函数用于读取输入并输出结果。

我们的HDOJ一定有不少A+B问题,现在有个新的来了。给你两个十六进制(hexadecimal)整数,把他们加起来然后也用十六进制输出吧。简单吗?A了它!

输入

多组输入数据,处理到文件尾。 每组包括A和B两个十六进制数,隔一个空格(seperated by a blank)。 A和B的长度小于15。

输出

每组在一行中输出A和B的十六进制和。

WA代码待对拍:

#include<iostream>
using namespace std;
long long mi(int x, int n)//幂函数
{
	long long res = 1;
	for (int i = 1; i <= n; i++)
		res *= x;
	return res;
}
long long hextodec(char* hex)//十六转十函数
{
	int length = 0;
	for (int i = 0; hex[i] != '\0'; i++)
		length++;//统计字符串长度(即十六进制数的位数加上负号)
	long long res = 0;
	int minus = 0;
	if (*hex == '-')
	{
		minus = 1;
		hex++;
		length--;
	}
	else if (*hex == '+')
	{
		hex++;
		length--;
	}
	for (int i = length - 1; i >= 0; i--)//i等于几,就加16的几次方
	{
		switch (*(hex + length - 1 - i))
		{
		case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:
			res += (*(hex + length - 1 - i) - 48) * mi(16, i);//0~9的ASCII码为48到57
			break;
		case 65:case 66:case 67:case 68:case 69:case 70:
			res += (*(hex + length - 1 - i) - 55) * mi(16, i);//A~F的ASCII码为65到70
			break;
		default:break;
		}
	}
	if (minus == 1)
		return -res;
	else
		return res;
}
char* dectohex(long long n)//十转十六函数
{
	if (n == 0)
	{
		char hex[2] = "0";
		return hex;
	}
	int length;
	int minus = 0;//记录是不是负数
	if (n < 0)//如果n是负数,则暂时转正
	{
		minus = 1;
		n = -n;
	}
	for (int i = 15; i >= 0; i--)
	{
		if (n >= mi(16, i))
		{
			length = i + 1;//计算n转成十六之后有多少位数
			break;
		}
	}
	char hex[18];
	for (int i = length - 1 + minus; i >= 0; i--)//如果是负数,则第一位数的字符数组下标+1
	{
		switch (n % 16)
		{
		case 10:hex[i] = 'A'; break;
		case 11:hex[i] = 'B'; break;
		case 12:hex[i] = 'C'; break;
		case 13:hex[i] = 'D'; break;
		case 14:hex[i] = 'E'; break;
		case 15:hex[i] = 'F'; break;
		case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:
		{
			hex[i] = n % 16 + 48;
			break;
		}
		default:break;
		}
		n = n / 16;
	}
	hex[length + minus] = '\0';
	if (minus == 1)
		hex[0] = '-';
	return hex;
}
int main()
{
	char a[17] = "\0";
	char b[17] = "\0";
	while(cin >> a >> b)
	{
		for (int j = 0; dectohex(hextodec(a) + hextodec(b))[j] != '\0'; j++)
			cout << dectohex(hextodec(a) + hextodec(b))[j];
		cout << endl;
	}
	return 0;
}

转载于:https://my.oschina.net/u/4035395/blog/3011207

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值