题目传送门 http://acm.hdu.edu.cn/showproblem.php?pid=2057
题目要求我们求两个十六进制数的加和并且转换成十六进制输出,要注意的是,题目说数字的长度不超过15位,所以我们需要用longlong类型进行计算防止溢出,还要解析十六进制数的时候要注意每一位的权值都比上一位大16倍。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxsize = 100;
//解析数字 ,并且转换成10进制
ll parse(char a[]){
ll result = 0; //存放解析结果
int sign = 1; //用于存放符号
if(a[0]=='-') sign = -1;
for(int i=0; a[i]!='\0'; i++){
if(a[i]=='+' || a[i]=='-'){
continue; //直接略过
}
if((a[i]>='0'&&a[i]<='9') || (a[i]>='A'&&a[i]<='F')){
//如果是数字的话就解析
int number = 0;
if(a[i]>='0'&&a[i]<='9'){
number = a[i]-'0';
} else if(a[i]>='A'&&a[i]<='F'){
/*if(a[i] == 'A') number = 10;
if(a[i] == 'B') number = 11;
if(a[i] == 'C') number = 12;
if(a[i] == 'D') number = 13;
if(a[i] == 'E') number = 14;
if(a[i] == 'F') number = 15;*/
number = a[i]-'A'+10;
}
result = result*16 + number;
}
}
//最后别忘了符号
result *= sign;
//printf("result=%lld\n", result);
return result;
}
//将十进制数字变成16进制
void toHex(ll n){
//printf("n=%lld\n", n);
char a[maxsize]; //用于存放结果
int index = 0; //结果数组指针
int r; //用于存放余数
if(n<0){
n = -n;
a[index++] = '-';
}
if(n == 0){
a[index++] = '0';
a[index] = '\0';
printf("%s\n", a);
return;
}
while(n != 0){
r = abs(n%16);
if(r>=0 && r<=9) a[index] = r+'0';
else if(r>=10 && r<=15) a[index] = r-10+'A';
index++;
n = n/16;
}
//将结果数组翻转得到想要的16进制数
//a[index] = '\0'; //结束标记
if(a[0]!='-'){
reverse(a, a+index);
} else {
reverse(a+1, a+index);
}
for(int i=0; i<index; i++){
printf("%c", a[i]);
}
printf("\n");
}
int main(){
char a[maxsize];
char *b; //用于接收结果
while(scanf("%s", a)!=EOF){
ll number1 = parse(a); //解析第一个数字
scanf("%s", a);
ll number2 = parse(a); //解析第二个数字
ll result = number1 + number2;
toHex(result);
}
return 0;
}