题目描述:
Problem Description
There must be many A + B problems in our HDOJ , now a new one is coming.
Give you two hexadecimal integers , your task is to calculate the sum of them,and print it in hexadecimal too.
Easy ? AC it !
Input
The input contains several test cases, please process to the end of the file.
Each case consists of two hexadecimal integers A and B in a line seperated by a blank.
The length of A and B is less than 15.
Output
For each test case,print the sum of A and B in hexadecimal in one line.
Sample Input
+A -A
+1A 12
1A -9
-1A -12
1A -AA
Sample Output
0
2C
11
-2C
-90
思路:
题目要求以16进制的形式接收两个整形数据,将这两个数相加,然后以16进制的形式输出计算结果,其中,输出的16进制数的字母要求大写。
首先介绍一下iomanip头文件。iomanip,io代表输入输出,manip是manipulator(操纵器)的缩写。iomanip头文件里是一些操纵cin,cout的运算子,主要是为了实现格式化输入输出。
题目要求以16进制的形式接收和输出整形数据,因此可以使用iomanip头文件中的hex控制函数。另外,输出的16进制数的字母默认是小写的,题目要求将其改为大写,同样可以使用iomanip头文件中的uppercase控制函数实现此功能。
此题的一个坑是关于计算结果是负数的处理。在C++中,16进制数的输出是以补码的形式进行的,正数的补码就是其本身,可以直接输出;而负数的补码是这个数的反码再加1,其中最高位代表符号位,不可以直接输出,需要进一步处理。计算结果是负数的处理方法是先输出这个负数的绝对值,即一个正数,再在该正数的前面添加一个负号,得到想要的结果。
实现(C++):
#include <iostream>
#include <cstdio>
#include <iomanip>
using namespace std;
int main(){
long long m, n;
long long result;
while(cin>>hex>>m>>n){
result=m+n;
if(result<0){
cout<<"-";
cout<<hex<<uppercase<<-result<<endl;
}
else
cout<<hex<<uppercase<<result<<endl;
}
}