【HDU 2057】 A + B Again

题目传送门 http://acm.hdu.edu.cn/showproblem.php?pid=2057

题目要求我们求两个十六进制数的加和并且转换成十六进制输出,要注意的是,题目说数字的长度不超过15位,所以我们需要用longlong类型进行计算防止溢出,还要解析十六进制数的时候要注意每一位的权值都比上一位大16倍。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

const int maxsize = 100;

//解析数字 ,并且转换成10进制 
ll parse(char a[]){
	ll result = 0;	//存放解析结果 
	int sign = 1;	//用于存放符号 
	if(a[0]=='-') sign = -1; 
	for(int i=0; a[i]!='\0'; i++){
		if(a[i]=='+' || a[i]=='-'){
			continue;	//直接略过 
		}
		if((a[i]>='0'&&a[i]<='9') || (a[i]>='A'&&a[i]<='F')){
			//如果是数字的话就解析
			int number = 0;
			if(a[i]>='0'&&a[i]<='9'){
				number = a[i]-'0';
			}  else if(a[i]>='A'&&a[i]<='F'){
				/*if(a[i] == 'A') number = 10;
				if(a[i] == 'B') number = 11;
				if(a[i] == 'C') number = 12;
				if(a[i] == 'D') number = 13;
				if(a[i] == 'E') number = 14;
				if(a[i] == 'F') number = 15;*/
				
				number = a[i]-'A'+10;
				
			}
			result = result*16 + number;
		}
	}
	//最后别忘了符号
	result *= sign;
	//printf("result=%lld\n", result);
	return result; 
}

//将十进制数字变成16进制 
void toHex(ll n){
	//printf("n=%lld\n", n);
	char a[maxsize];	//用于存放结果 
	int index = 0;		//结果数组指针 
	int r;	//用于存放余数
	if(n<0){
	    n = -n;
		a[index++] = '-'; 
	}
	if(n == 0){
		a[index++] = '0';
		a[index] = '\0';
		printf("%s\n", a);
		return;
	}
	while(n != 0){
		r = abs(n%16);
		if(r>=0 && r<=9) a[index] = r+'0';
		else if(r>=10 && r<=15) a[index] = r-10+'A';
		index++;
		n = n/16;
	}
	//将结果数组翻转得到想要的16进制数
	//a[index] = '\0';	//结束标记 
	if(a[0]!='-'){
		reverse(a, a+index);
	} else {
		reverse(a+1, a+index);
	}
	for(int i=0; i<index; i++){
		printf("%c", a[i]);
	}
	printf("\n");
}

int main(){
	char a[maxsize];
	char *b;	//用于接收结果 
	while(scanf("%s", a)!=EOF){
		ll number1 = parse(a);	//解析第一个数字 
		scanf("%s", a);
		ll number2 = parse(a);	//解析第二个数字
		ll result = number1 + number2;
		toHex(result);
	}
	return 0;
}
发布了130 篇原创文章 · 获赞 151 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/haohulala/article/details/89636571
今日推荐