高精度运算是我们在算法题中经常用到的一种题型,今天我来给大家分享一下高精度加减乘除的方法:
由于高精度类型题目用vector数组实现起来更为方便,所以我主要以vector数组来介绍高精度解决方法
高精度加法
给定两个正整数,计算它们的和。
共两行,每行包含一个整数。
共一行,包含所求的和。
1≤整数长度≤1000001≤整数长度≤100000
12
23
35
#include<bits/stdc++.h> 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];//vector数组与普通数组的一个区别是,vector数组只有在有值的情况下才能被访问 C.push_back(t%10); t/=10; } if(t) C.push_back(t); return C; } int main() { string a,b; vector<int> A,B,C; 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‘); C=add(A,B); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); return 0; }
高精度减法
给定两个正整数,计算它们的差,计算结果可能为负数。
共两行,每行包含一个整数。
共一行,包含所求的差。
1≤整数长度≤1051≤整数长度≤105
32
11
21
#include<bits/stdc++.h> using namespace std; bool cmp(vector<int> A,vector<int> B)//比较A和B的大小,用大数减小数 { if(A.size()!=B.size()) return A.size()>B.size(); for(int i=A.size()-1;i>=0;i--) { if(A[i]!=B[i]) return A[i]>B[i]; } return true; } vector<int>sub(vector<int> A,vector<int> B) { vector<int>C; int t=0; for(int i=0;i<A.size();i++) { t=A[i]-t; if(i<B.size()) t-=B[i]; C.push_back((t+10)%10); if(t<0) t=1;//相当于借位 else t=0; } while(C.size()>1&&C.back()==0) C.pop_back();//除去前导0 return C; } int main() { string a,b; vector<int> A,B,C; 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‘); if(cmp(A,B)) C=sub(A,B); else C=sub(B,A),cout<<"-"; for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); return 0; }
高精度乘法
给定两个正整数 AA 和 BB,请你计算 A×BA×B 的值。
共两行,第一行包含整数 AA,第二行包含整数 BB。
共一行,包含 A×BA×B 的值。
1≤A的长度≤1000001≤A的长度≤100000,
0≤B≤100000≤B≤10000
2
3
6
#include<bits/stdc++.h> using namespace std; vector<int>mul(vector<int> A,int b) { vector<int>C; int t=0; for(int i=0;i<A.size();i++) { t+=A[i]*b; C.push_back(t%10); t/=10; } while(t) C.push_back(t%10),t/=10; while(C.size()>1&&C.back()==0) C.pop_back();//除去前导0
return C; } int main() { string a; vector<int> A,C; int b; cin>>a>>b; for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-‘0‘); C=mul(A,b); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); return 0; }
高精度除法
给定两个非负整数 A,BA,B,请你计算 A/BA/B 的商和余数。
共两行,第一行包含整数 AA,第二行包含整数 BB。
共两行,第一行输出所求的商,第二行输出所求余数。
1≤A的长度≤1000001≤A的长度≤100000,
1≤B≤100001≤B≤10000,
BB 一定不为 00
7
2
3 1
#include<bits/stdc++.h> using namespace std; vector<int>div(vector<int> A,int b,int &r) { vector<int>C; r=0; for(int i=A.size()-1;i>=0;i--) { r=r*10+A[i]; C.push_back(r/b); r%=b; } reverse(C.begin(),C.end());//进行除法运算时是从高位到低位进行的,所以不能忘记反转 while(C.size()>1&&C.back()==0) C.pop_back(); return C; } int main() { string a; vector<int> A,C; int b; cin>>a>>b; for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-‘0‘); int r; C=div(A,b,r); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); printf("\n%d\n",r); return 0; }
以上就是我分享的高精度运算方法了,希望大家能够喜欢!
原文:https://www.cnblogs.com/AC--Dream/p/14726342.html