PS:一开始我画蛇添足的用字符串来做....超麻烦...贴个我做的..

代码:

#include "stdio.h"
#include "string.h"
#include "math.h"
long long cal(char a[]);
long long back(long long a,char b[],long long &flag);
char c[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int main(){
	char a[110],b[110],sum[110];
	long long sum1,i,s,flag;
	while(~scanf("%s%s",&a,&b)){
		sum1=cal(a)+cal(b);    //两个十六进制数转换成十进制数相加 
		s=back(sum1,sum,flag);  //flag是用来判断正负 
		if(flag==0){
		  for(i=s;i>=0;i--){
			  printf("%c",sum[i]);
		  }
		  puts("");
		}
		else{
		  printf("-");
		  for(i=s;i>0;i--){
			  printf("%c",sum[i]);
		  }
		  puts("");

		}
	}
	return 0;
}
long long back(long long a,char b[],long long &flag){   //从十进制数变到十六进制数 
	long long i=0,k,t;
	flag=0;
	if(a>=0){
	  t=a;
	  while(t/16!=0){
		  k=t%16;
		  b[i++]=c[k];
		  t=t/16;	
	  }
	  k=t%16;
	  b[i]=c[k];
	}
	else{
	  flag=1;	
	  t=-a;
	  b[i++]='-';
	  while(t/16!=0){
		  k=t%16;
		  b[i++]=c[k];
		  t=t/16;	
	  }
	  k=t%16;
	  b[i]=c[k];
	}
	return i;
}
long long cal(char a[]){          //从十六进制数变成十进制数 
 	long long i,s,j,sum=0;
	if(a[0]=='-'){
		s=strlen(a);
		for(i=1;i<s;i++){
			for(j=0;j<16;j++){
				if(a[i]==c[j]){
					sum+=j*pow(16,s-i-1);
					break;
				}
			}
		}
		sum=-sum;
	}
	else if(a[0]=='+'){
		s=strlen(a);
		for(i=1;i<s;i++){
			for(j=0;j<16;j++){
				if(a[i]==c[j]){
					sum+=j*pow(16,s-i-1);
					break;
				}
			}
		}
	}
	else{
		s=strlen(a);   
		for(i=0;i<=s-1;i++){
			for(j=0;j<16;j++){
				if(a[i]==c[j]){
					sum+=j*pow(16,s-i-1);
					break;
				}
			}
		}
	}
	return sum;
}

 

 

 PS:后来才知道可以用%X输入十六进制的整数...所以AC代码为下列

代码:

#include "stdio.h"
int main(){
	long long a,b,c;
	while(~scanf("%llX%llX",&a,&b)){
		c=a+b;
		if(c<0) {printf("-"); c=-c;}
		printf("%llX\n",c);
	}
	return 0;
	
}