链接: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;
}