EOJ3037-十六进制加法
题目
请编写程序实现两个十六进制整数的加法。
例如:十六进制整数 3762 和 05C3,3762+05C3=3D25
十六进制整数 CB9 和 957,CB9+957=1610
格式
输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。
接下来 T 行,每行输入两个十六进制整数 n 和 m (n,m 为不超过 200 位的十六进制整数),A~F 全部为大写字母。 两个整数之间用一个空格分隔。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。然后对应每个问题在一行中输出两个十六进制整数相加的结果,字母全部用大写字母。
样例
input
3
3762 05C3
CB9 957
F 1
output
case #0:
3D25
case #1:
1610
case #2:
10
code
#include <iostream>
#include <algorithm>
#include <stack>
#include <cstdio>
using namespace std;
int char2int(char x) {
if (x >= '0' && x <= '9') return x - '0';
return x - 'A' + 10;
}
char int2char(int x) {
if (x >= 0 && x <= 9) return x + '0';
return x - 10 + 'A';
}
int main() {
int n, i, j;
cin >> n;
char a[208],b[208];
stack<int>c, d, ans;
for (i = 0; i < n; i++) {
scanf("%s %s", a,b);
//入栈
for (j = 0; a[j] != '\0'; j++)
c.push(char2int(a[j]));
for (j = 0; b[j] != '\0'; j++)
d.push(char2int(b[j]));
//从栈顶开始加
int rec = 0;
while (!c.empty()&&!d.empty())
{
int temp = c.top() + d.top()+rec;
ans.push(temp%16);
rec = temp / 16;
c.pop();
d.pop();
}
//位数不相等的情况
while (!c.empty())
{
ans.push((c.top() + rec)%16);
rec = (c.top() + rec) / 16;
c.pop();
}
while (!d.empty())
{
ans.push((d.top() + rec) % 16);
rec = (d.top() + rec) / 16;
d.pop();
}
//输出
cout << "case #" << i << ":" << endl;
if (rec) cout << '1';//判断是否还有进位
while (!ans.empty()) {
cout << int2char(ans.top());
ans.pop();
}
cout << endl;
}
return 0;
}
我真是对自己无语了,这么简单的题居然搞了半天,今天我就是一只猪脑袋,一点也不适合做题!