#include<vector>// C = A + B, A >= 0, B >= 0
vector<int>add(vector<int>&A, vector<int>&B)//加引用可以增加效率{
if(A.size()< B.size())returnadd(B, A);//进行判断,将保证大数是 A ,小数是 B
vector<int> C;//建立结果int t =0;//设置一个进位tfor(int i =0; i < A.size(); i ++){
t += A[i];//t加上当前的 A 中的第 i 位if(i < B.size()) t += B[i];//判断小数B是否加完,没有就加上
C.push_back(t %10);//加上 t 的10余数
t /=10;//此时t变成下一个的进位}if(t) C.push_back(t);return C;}
作者:yxc!!!
链接:https://www.acwing.com/blog/content/277/!!!
来源:AcWing!!!
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。!!!
(2)高精度减法
高精度减法其实与高精加法类似,对于进位有特殊的处理方式,同时对输出数,如:003,要转化为3.
#include<iostream>#include<vector>usingnamespace std;//这里是比较大小,如果B > A ,将A 和 B 的顺序调换,这样方便进行减法运算boolcmp( vector<int>&A , vector<int>&B ){
if( A.size()!= B.size())return A.size()> B.size();else{
for(int i = A.size()-1; i>=0; i--)if( A[i]!= B[i])return A[i]> B[i];}returntrue;}
vector<int>sub( vector<int>&A , vector<int>&B ){
vector<int> C;for(int i =0, t =0; i < A.size(); i++)//t充当结为数{
t = A[i]- t ;if( i < B.size()) t -= B[i];
C.push_back(( t +10)%10);//这一步加10主要是防止是负数的情况,即要向前借位。if( t <0) t =1;else t =0;}while( C.size()>1&& C.back()==0) C.pop_back();return C;}intmain(){
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');//这里使用vector将字符串变 //成整形并存入A这个vector数组中for(int i = b.size()-1; i>=0; i--) B.push_back( b[i]-'0');if(cmp( A , B )){
auto C =sub( A , B );for(int i = C.size()-1; i>=0; i--) cout<<C[i];}else{
auto C =sub( B ,A );
cout<<"-";for(int i = C.size()-1; i>=0; i--) cout<<C[i];}}
作者:yxc!!!
链接:https://www.acwing.com/blog/content/277/!!!
来源:AcWing!!!
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。!!!
(3)高精度乘法乘低精
#include<iostream>#include<vector>usingnamespace std;
vector<int>mul( vector<int> A ,int b ){
int t =0;
vector<int> C;for(int i =0; i < A.size()|| t ; i++){
if( i < A.size()) t += A[i]* b;
C.push_back( t %10);
t /=10;}while( C.size()>1&& C.back()==0) C.pop_back();return C;}intmain(){
string a;int b;
cin>>a>>b;
vector<int> C,A;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--) cout<<C[i];}
(4)高精度除法除低精
#include<iostream>#include<vector>#include<algorithm>usingnamespace 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;}intmain(){
string a;int b , r;
cin>>a>>b;
vector<int> C,A;for(int i = a.size()-1; i >=0; i--) A.push_back( a[i]-'0');
C =div( A , b , r );for(int i = C.size()-1; i>=0; i--) cout<<C[i];
cout<< endl << r << endl;}