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