链接:https://acm.hdu.edu.cn/showproblem.php?pid=2057
大意是给出十六进制的 数字字符串,完成两个相加。有正负号。
感觉很可怕是不是???确实很可怕,自己想用字符串处理,写了八十多行硬是啃不下来。看看大佬代码
code:
#include<stdio.h> #include<string.h> long long fun1(char *a) { long long b=0,len,i=0; len=strlen(a); if(a[0]=='-'||a[0]=='+') { i=1; } while(i!=len) { if(a[i]<'0'||(a[i]>'9'&&a[i]<'A')||a[i]>'Z') i++; b=b*16; switch(a[i]) { case 'A': b=b+10; break; case 'B': b=b+11; break; case 'C': b=b+12; break; case 'D': b=b+13; break; case 'E': b=b+14; break; case 'F': b=b+15; break; default: b=b+a[i]-48; } i++; } if(a[0]=='-') b=b*(-1); return b; } void fun2(long long num) { char b[17]; int i,j; i=-1; if(num<0) { printf("-"); num=num*(-1); } if(num==0) printf("0\n"); else { while(num/16) { i++; switch(num%16) { case 10: b[i]='A'; break; case 11: b[i]='B'; break; case 12: b[i]='C'; break; case 13: b[i]='D'; break; case 14: b[i]='E'; break; case 15: b[i]='F'; break; default: b[i]=num%16+48; } num=num/16; } if(num%16!=0) { i++; switch(num%16) { case 10: b[i]='A'; break; case 11: b[i]='B'; break; case 12: b[i]='C'; break; case 13: b[i]='D'; break; case 14: b[i]='E'; break; case 15: b[i]='F'; break; default: b[i]=num%16+48; } } for(; i>=0; i--) printf("%c",b[i]); printf("\n"); } } int main() { char a[16],b[16]; while(~scanf("%s %s",a,b)) { long long num; num=fun1(a)+fun1(b); fun2(num); } return 0; }
然后就是技巧性的输入输出,此处来自博客
https://blog.csdn.net/weixin_45882303/article/details/104475624
针对这道题的代码
code:
#include<iostream> #include<iomanip> using namespace std; typedef long long ll; int main() { ll a,b; while(cin>>hex>>a>>b) { if(a+b>=0) cout<<hex<<uppercase<<a+b<<endl; else cout<<hex<<uppercase<<'-'<<-(a+b)<<endl; } return 0; }