题目来源
AcWing:https://www.acwing.com/problem/content/3705/
题目描述
16进制不进位的加法,即和正常加法类似,只是不用去计算进位的数,比正常的加法更简单。
如 A+6=0(正常加法是 10,但是由于不进位所以只有 0)。
输入格式
输入包含多组测试数据。
每组数据占一行,包含两个十六进制数,字母统一大写。
输出格式
每组数据输出一行不进位加法的结果。结果中可能包含前导 0。
数据范围
输入数字长度不超过 100。
输入样例:
123 456
6 A
输出样例:
579
0
为什么要用高精度?
本类题本身不需要用高精度,但是本题数据范围最大到了100位,如果不用高精度的话会导致时间超限,所以使用高精度。
高精度算法
关键代码
// 高精度加法
vector<int> add (vector<int> &A, vector<int> &B) // 返回一个int类型的动态数组,表示两个数组A和B的和
{
vector<int> C;
int t = 0; // 表示当前位两个数的和
for (int i = 0; i < A.size() || i < B.size(); i ++ ) // 只要A, B两个数组有一个还没结束,就继续
{
if (i < A.size()) t += A[i]; // 如果当前A还没加完,就加上A当前位的数
if (i < B.size()) t += B[i]; // 同理
C.push_back(t % 10); // 将t的个位存起来
t /= 10; // 得到t的十位,如果有进位,t会是1; 如果没有,t会是0
}
if (t) // 如果最高位还有进位
C.push_back(1); // 就在最高位多添一位1
return C;
}
题目完整代码
#include <vector>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
// 高精度加法
vector<int> add (vector<int> &A, vector<int> &B) // 返回一个int类型的动态数组,表示两个数组A和B的和
{
vector<int> C;
int t = 0; // 表示当前位两个数的和
for (int i = 0; i < A.size() || i < B.size(); i ++ ) // 只要A, B两个数组有一个还没结束,就继续
{
if (i < A.size()) t += A[i]; // 如果当前A还没加完,就加上A当前位的数
if (i < B.size()) t += B[i]; // 同理
C.push_back(t % 10); // 将t的个位存起来
t /= 10; // 得到t的十位,如果有进位,t会是1; 如果没有,t会是0
}
if (t) // 如果最高位还有进位
C.push_back(1); // 就在最高位多添一位1
return C;
}
int main()
{
string a, b;
vector<int> A, B;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0'); // 遍历字符串a,b, 将输入的字符串a, b装入A, B数组
for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');
auto C = add(A, B);
for (int i = C.size() - 1; i >= 0; i -- ) // 倒序遍历C数组(因为C中的数是倒着存的)
{
cout << C[i];
}
cout << endl;
return 0;
}