A + B Again HDU

来源:互联网 发布:周扬青淘宝店铺货源 编辑:程序博客网 时间:2024/06/03 13:59

T - A + B Again

HDU - 2057

There must be many A + B problems in our HDOJ , now a new one is coming.
Give you two hexadecimal integers , your task is to calculate the sum of them,and print it in hexadecimal too.
Easy ? AC it !

Input
The input contains several test cases, please process to the end of the file.
Each case consists of two hexadecimal integers A and B in a line seperated by a blank.
The length of A and B is less than 15.
Output
For each test case,print the sum of A and B in hexadecimal in one line.
Sample Input
+A -A+1A 121A -9-1A -121A -AA
Sample Output
02C11-2C-90



思路:


其实这一道题就是我们做十六进制的加法问题~



好的~我们来看一下我们要温习的一些知识


1 2 3 4 5 6 7 8 9 0

A=10

B=11

C=12

D=13

E=14

F=15

看起来这是一个不定case而且是以文件的结束输入结束符号为结束标志的输入情况呢!

看来我们可以用两个string 数字来接收我们输入的数据了~

接受到我们的数据后应该如何处理呢?

嗯,我想,还是转换成我们熟悉的十进制来进行计算吧~

首先我们可以接收第一个字符,如果第一个字符是‘+’的话那么也没有什么所谓呀

如果是‘-’的话我们注意一下标记好了~

注意!我们要转换成10进制的时候,千万不能想当然!


要根据规则来计算啊!是对应位数乘上我们的权值的x次方!


说个例子吧~


例如A32;


A=10;它对应的是16*16,所以代表了2560


3,它对应的是16,所以代表了48



2,它代表的是1(16的0次方),所以代表了2;


所以这个数字转换为十进制的数字就是2610

再看一下有没有‘-’号标志,进行项对应的相反数处理。
我们得到了两个十进制的数字之后就可以进行求和啦~


求和完成了之后就是输出了,我们要注意的是


1
输出的时候,如果是正数并不需要输出一个‘+’


2


如果是负数,要输出一个‘-’哦!!


问题来了,我们应该如何输出答案呢?


这个时候我们需要有一点点的相对应的知识,那就是不断除,然后取余数


例如我们的十进制150,转换为十六进制的数字,


首先150/16=9(商)余6


然后 9(前商)/16=0(商)余9

然后余数从下面开始得,所以我们就得到了150(10进制)和96(十六进制)

我们就模拟这个过程,结束标志是商为0

对应的,根据所得余数,一个个存完后,再一个个从末尾进行处理,如果有必要,换成相对应的字符存到一个string里面,之后再进行输出



#include<iostream>#include<string>using namespace std;long long sum1 = 0;long long sum2 = 0;long long sum3 = 0;int main(){//A 10 B 11 C 12 D 13 E 14 F 15string x = " ";string y = " ";while (cin >> x >> y){sum1 = 0;sum2 = 0;sum3 = 0;long long a[15];long long b[15];for (int i = 0; i < 15; i++){a[i] = 0;}for (int i = 0; i < 15; i++){b[i] = 0;}if (x[0] == '+'){x.erase(0, 1);}if (y[0] == '+'){y.erase(0, 1);}int xnegative = 0;int ynegative = 0;if (x[0] == '-'){x.erase(0, 1);xnegative = 1;}if(y[0]== '-'){y.erase(0, 1);ynegative = 1;}for (int i = 0; i < x.size(); i++){long long j = 1;for (int k=1;k<x.size()-i;k++ ){j = j * 16;}if (x[i] >= 'A'&&x[i] <= 'F'){if (x[i] == 'A'){a[i] = 10 * j;}if (x[i] == 'B'){a[i] = 11 * j;}if (x[i] == 'C'){a[i] = 12 * j;}if (x[i] == 'D'){a[i] = 13 * j;}if (x[i] == 'E'){a[i] = 14 * j;}if (x[i] == 'F'){a[i] = 15 * j;}}else{a[i] = (x[i] - '0')*j;}}for (int i = 0; i < x.size(); i++){sum1 = sum1 + a[i];}if (xnegative == 1)sum1 = (-1)*sum1;//for (int i = 0; i < y.size(); i++){long long j = 1;for (int k=1; k<y.size() - i;k++){j = j * 16;}if (y[i] >= 'A'&&y[i] <= 'F'){if (y[i] == 'A'){b[i] = 10 * j;}if (y[i] == 'B'){b[i] = 11 * j;}if (y[i] == 'C'){b[i] = 12 * j;}if (y[i] == 'D'){b[i] = 13 * j;}if (y[i] == 'E'){b[i] = 14 * j;}if (y[i] == 'F'){b[i] = 15 * j;}}else{b[i] = (y[i] - '0')*j;}}for (int i = 0; i < y.size(); i++){sum2 = sum2 + b[i];}if (ynegative == 1){sum2 = (-1)*sum2;}//cout << sum1 << endl << sum2 << endl;sum3 = sum1 + sum2;if (sum3 < 0){cout << "-";sum3 = -1*sum3;}int h[100];for (int i = 0; i < 100; i++)h[i] = -1;long long shang = 0;for (int i=0;;i++){shang = sum3 / 16; h[i] = sum3 - shang * 16; if (shang == 0) break; sum3 = shang;}int pos = 0;for (int i = 0; i < 100; i++){if (h[i] == -1){pos = i;break;}}for (int i = pos; i >= 0; i--){if (h[i] == 10){cout << "A";}if (h[i] == 11){cout << "B";}if (h[i] == 12){cout << "C";}if (h[i] == 13){cout << "D";}if (h[i] == 14){cout << "E";}if (h[i] == 15){cout << "F";}if (h[i] >= 0 && h[i] <= 9){cout << h[i];}if (i == 0)cout << endl;}}}

原创粉丝点击