$$高精度加法$$
题目大意:给定两个数a,b,求两个数的和
大家一眼看这道题非常简单,但是我们看一下数据范围:
1≤整数长度≤100000
这道题不仅int存不下,连longlong都存不下了。
虽然基本数据类型放不下了,但是还有一种数据类型:字符串
高精度加法的方法就是我们一年级就学过的竖式
从个位开始加,逢十进一。
现在,我们要用程序写出来这种方法。
首先定义一个t,代表进位。
然后输入两个字符串,代表两个数
接下来这步大家很容易漏掉,但是这恰恰是很重要的一步。
把字符串倒着转换为普通数组。
为啥要倒着来呢?因为我们是从个位开始计算,倒着更方便。
接着就是按照平常竖式计算来做了。
for (int i=1; i<=cnt; i++) {
t += a[i] + b[i];//进位加上a和b第i位上的数
c[i] = t % 10;//c的值就是进位的个位数
t /= 10;//把t的个位数去掉只剩下十位数,即只剩下这个位置的进位
}
注意算完后要把t/10.
有一个细节:如果算完后还有进位,就把那个进位补上。
最后就是输出了,由于是倒着计算的,输出也要倒着输出。
c++完整代码1:
#include <iostream>
using namespace std;
const int N = 100010;
int A[N], B[N], C[N];
int Add(int a[], int b[], int c[], int cnt) {
int t = 0;//t表示进位
for (int i=1; i<=cnt; i++) {
t += a[i] + b[i];//进位加上a和b第i位上的数
c[i] = t % 10;//c的值就是进位的个位数
t /= 10;//把t的个位数去掉只剩下十位数,即只剩下这个位置的进位
}
if (t) c[++cnt] = 1;//如果t==1,表示还有一个进位,要补上
return cnt;
}
int main() {
string a, b;
cin >> a >> b;
//A和B倒着放进int数组,因为有进位,倒着放容易处理
int cnt1 = 0;
for (int i=a.size()-1; i>=0; i--)
A[++cnt1] = a[i] - '0';
int cnt2 = 0;
for (int i=b.size()-1; i>=0; i--)
B[++cnt2] = b[i] - '0';
int tot = Add(A, B, C, max(cnt1, cnt2));
//因为A和B是倒着放的,所以C也要倒着输出
for (int i=tot; i>=1; i--)
cout << C[i];
}
当然也可以用vector做,方法一样
c++完整代码2:
#include <iostream>
#include <vector>
using namespace std;
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 < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
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');
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 -- ) cout << C[i];
cout << endl;
return 0;
}
# $\text{AcWing}~791.~高精度加法$
## 题目大意:给定两个数a,b,求两个数的和。
大家一眼看这道题非常简单,但是我们看一下数据范围:
### $1≤整数长度≤100000$
这道题不仅$int$存不下,连$longlong$都存不下了。
虽然基本数据类型放不下了,但是还有一种数据类型:字符串
### 高精度加法的方法就是我们一年级就学过的竖式
## 从个位开始加,逢十进一。
现在,我们要用程序写出来这种方法。
首先定义一个$t$,代表进位。
然后输入两个字符串,代表两个数
接下来这步大家很容易漏掉,但是这恰恰是很重要的一步:把字符串倒着转换为普通数组。
为啥要倒着来呢?因为我们是从个位开始计算,倒着更方便。
接着就是按照平常竖式计算来做了。
注意算完后要把
t/10
.有一个细节:如果算完后还有进位,就把那个进位补上。
最后就是输出了,由于是倒着计算的,输出也要倒着输出。
C++完整代码1:
当然也可以用vector做,方法一样
C++代码2:
### 压位计算也可以,就是比较难理解,就不放代码了。
##### 点个赞吧!
给你浅浅修改了一下~
蟹蟹
感觉Markdown用这种1-3号字体会使题解不太美观(起码左右加个
$
都好啊)以后直接敲题解除题目外都不建议加粗加大,直接敲反而会看着更美观。。。。然后一些字母,数字,公式之类的可以用LaTex语法,会更美观,给大家带来更好的观感(笑)py:我int可以这里指c艹
压位!压位!