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; }