前言:
假如你遇到了一个数学家,他问你了一个问题
1234142753849769828392475016461956926986+9479376720769908639059720975868720987888
答案是几
人脑 :??????,有病吧
计算机:bomb
那么怎么解这类两个超过longlong类型的数字和呢
高精度:
1.思想
大家小时候学10+15是怎么算的呢
是不是这样呢
其实就是从最低位算起,数位对齐
那么怎么在C++实现它呢
2.实现
我们读入两个字符串,我们存不下这个整数
string q,p;
cin >> q >> p;
我们要从最后一位算起,所以要倒着添加
la = q.length();
lb = p.length();
for(int i = 0;i < la;++i){
a[i] = q[la - i - 1] - '0';
}
for(int i = 0;i < lb;++i){
b[i] = p[lb - i - 1] - '0';
}
接下来就是做加法了
void add(int la,int a[],int lb,int b[],int &lc,int c[]){//c数组存答案
lc = max(la,lb);
for(int i = 0;i < lc;++i)c[i] = a[i] + b[i];//计算每一位
for(int i = 0;i < lc;++i){
c[i + 1] += c[i] / 10;//处理进位
c[i] %= 10;
}
if(c[lc] > 0)++lc;//如果最高位有进位,则答案长度加1
}
输出要注意一下,我们是倒着读入也要倒着输出
for(int i = lc - 1;i >= 0;i--){
cout << c[i];
}
完整代码
#include <bits/stdc++.h>
using namespace std;
int a[10500],b[10500],c[10500],la,lb,lc;
void print(int l,int a[]) {
for (int i=l-1;i>=0;--i) cout<<a[i];
cout<<endl;
}
void add(int la,int a[],int lb,int b[],int &lc,int c[]){
lc = max(la,lb);
for(int i = 0;i < lc;++i)c[i] = a[i] + b[i];
for(int i = 0;i < lc;++i){
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
if(c[lc] > 0)++lc;
}
int main(){
string q,p;
cin>> q >> p;
la = q.length();
lb = p.length();
for(int i = 0;i < la;++i){
a[i] = q[la - i - 1] - '0';
}
for(int i = 0;i < lb;++i){
b[i] = p[lb - i - 1] - '0';
}
add(la,a,lb,b,lc,c);
for(int i = lc - 1;i >= 0;i--){
cout << c[i];
}
return 0;
}
减法也类似
#include <bits/stdc++.h>
using namespace std;
int a[10500],b[10500],c[10500],la,lb,lc;
void print(int l,int a[]) {
for (int i=l-1;i>=0;--i) cout<<a[i];
cout<<endl;
}
void minuss(int la,int a[],int lb,int b[],int &lc,int c[]){
lc = la;
for(int i = 0;i < lc;++i)c[i] = a[i] - b[i];
for(int i = 0;i < lc;++i){
if(c[i] < 0){
c[i + 1]--,c[i] += 10;
}
}
while(lc > 0 && c[lc] == 0)--lc;
}
int main(){
string q,p;
cin>> q >> p;
la = q.length();
lb = p.length();
for(int i = 0;i < la;++i){
a[i] = q[la - i - 1] - '0';
}
for(int i = 0;i < lb;++i){
b[i] = p[lb - i - 1] - '0';
}
minuss(la,a,lb,b,lc,c);
for(int i = lc;i >= 0;i--){
cout << c[i];
}
return 0;
}
例题:P1601 A+B Problem(高精)
A+B Problem(高精) - 洛谷https://www.luogu.com.cn/problem/P1601 这儿就是基本的加法,我就不多说了
留个思考题,乘法高精怎么做
A*B Problem - 洛谷https://www.luogu.com.cn/problem/P1303本题下期揭秘
求点赞,求关注,我们下期再见