小学时,我们都学过加法,1+1=2
回忆计算加法有哪些注意事项?
1. 进位
2. 从低位到高位
3. 对齐
在做一些题时,int (-2^31---2^31-1) ,long long (-2^631---2^63-1)都不能满足做题需要,
有些题,例如:
【题目描述】
输入两个不超过500位的正整数 ,
求这两个数的和是多少。
【输入样例】
998877665544332211
1234
【输出样例】 998877665544333445
这种题,500位数字,long long 都不能解决,更何况int类型了。
这种A+Bproblem,我们就可以用高精度加法。
首先,先编好框架
# include <bits/stdc++.h> //万能头文件
using namespace std;
int main(){
return 0;
}
接着,定义几个全局变量,用字符串存放输入数据 , 保存加数,算出长度。
# include <bits/stdc++.h> //万能头文件
using namespace std;
string x,y; //用字符串存放输入数据
int a[550]; //保存加数 1
int b[550]; //保存加数 2
int sum[550]; //保存和
int main(){
cin >> x >> y; //输入
int lenx = x.size(); //算出长度1
int leny = y.size(); //算出长度2
return 0;
}
为了数位对齐,我们将字符串中的数据,逆向输入到int数组中,注意转换格式,如下
for(int i = 0;i < lenx; i++){
a[i] = x[lenx-i-1]-'0';
}
for(int i = 0;i < leny; i++){
b[i] = y[leny-i-1]-'0';
}
再,模拟求和:
int l = max(lenx,leny);
for(int i = 0;i < l; i++){
sum[i] = a[i]+b[i];//模拟求和
}
下面,我们不要忘记进位:
for(int i = 0;i < l; i++){
sum[i+1] += sum[i]/10;//模拟进位
sum[i] %= 10;
}
如果这时,我们直接方向输出的话,就会发现,如果样例进位了,则十分正常,但如果没有进位,则会在开头多出一个0,我们只需要判断后,删掉那个0就行.
if(sum[l] == 0){///判断我的最高位是否有进位,没有进位就删0
l--;
}
最后,反序输出:
for(int i = l;i >= 0; i--){
cout << sum[i];
}
这就是高精度加法运算。
以下需要注意几个事项:
1、最高位没有进位 就需删0
2、最高位有进位 就没0
3、输入要通过字符串进行输入
接下来是一个完整程序:
#include <bits/stdc++.h>
using namespace std;
string x,y;///用来保存输入
int a[550];//保存被加数
int b[550];//保存加数
int sum[550];
int main(){
cin >> x >> y;
int lenx = x.size();
int leny = y.size();
for(int i = 0;i < lenx; i++){
a[i] = x[lenx-i-1]-'0';
}
for(int i = 0;i < leny; i++){
b[i] = y[leny-i-1]-'0';
}
int l = max(lenx,leny);
for(int i = 0;i < l; i++){
sum[i] = a[i]+b[i];//模拟求和
}
for(int i = 0;i < l; i++){
sum[i+1] += sum[i]/10;//模拟进位
sum[i] %= 10;
}
if(sum[l] == 0){///判断我的最高位是否有进位,没有进位就删0
l--;
}
for(int i = l;i >= 0; i--){
cout << sum[i];
}