引用
有大佬用数组写了一遍,可以参考,记得去前导零,因为开数组的时候都是比数据范围大,(emmm,其实也可以不用,不过写成函数的话可以搞个计数器,记录位数,然后输出2333,灵活运用吧),orz
Java的小伙伴也可以学一下,貌似有些题目不能用Big Integer,毕竟算法这个东西学到一点是一点,不能因为语言特性而不去学
还有一点就是用数组貌似比STL快了一倍,不过这时差可以忽略不计,但是比如链表的操作这些用数组作为静态链表去模拟的话速度会快很多,而且写法也简单,特别是数据很大的时候,用数组往往是很好的选择,当然这也是后话了
对于压位感兴趣的小伙伴也可以试试,引用的题解中有,但是一般应该用不上
lyclyc_NSP AcWing 791. 高精度加法C++数组实现
二月 AcWing 791. 高精度加法(使用string,30行) c++
题目描述
给定两个正整数,计算它们的和。
样例
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
$1≤整数长度≤100000$
输入样例:
12
23
输出样例:
35
算法
(高精度加法) $O(n)$
首先我们用字符串(字符数组也行,C++特有的数据类型string,其实也等价于字符数组,只不过更方便使用)读入,然后将其每一位存入数组中即可,只要我们的数组够大,就能完成我们的计算(不TLE的前提或者空间不超过限制,既然题目明确要用这种方法就不会让你超时)。
但是对于加法我们都知道的一点,也是最重要的一点。那就是十进制数是满十进一,因为我们是用数组去存数的每一位,所以在计算的时候我们应该倒序存数的每一位,即数组的第一位存的不是最高位而是最低位,这样在我们进位的时候会更加方便(最高位可能也要进位,而这时数组第0位已经有数了,再放就越界了,得把数组中的数往后移,这样就会特别麻烦)。
时间复杂度 $O(n)$
根据A的长度决定循环的次数,所以是线性的(应该没错吧,狗头保命)
C++ 代码
#include <iostream>
#include <vector>
using namespace std;
vector<int> A , B;
string a , b;
vector<int> add(vector<int> &A ,vector<int> &B)
{
if(A.size() < B.size()) return add(B , A);
vector<int> C;
int t = 0;
for(int i = 0; i < (int)A.size(); ++ i)
{
t += A[i];
if(i < (int)B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if(t) C.push_back(t);
return C;
}
int main()
{
cin >> a >> b;
for(int i = a.size() - 1; i >= 0; -- i) A.push_back(a[i] - '0');
for(int j = b.size() - 1; j >= 0; -- j) B.push_back(b[j] - '0');
auto C = add(A , B);
for(int k = C.size() - 1; k >= 0; -- k) cout << C[k];
return 0;
}