高精度加法
/* 模板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;}*/#include<iostream>#include<string>#include <vector>#include<cstdio>using namespace std;// C = A + B, A >= 0, B >= 0vector<int> add(vector<int> &A,vector<int> &B){ vector<int> C; int t=0; for(int i=0;i<A.size()||i<B.size();i++) { if(i<A.size()) t+=A[i]; if(i<B.size()) t+=B[i]; C.push_back(t%10); t/=10; } if(t) C.push_back(t); //不要忘记我爱你,t或许是1 return C;}int main(){ string a,b; vector<int> A,B; cin>>a>>b; //下面要注意范围,记得减1,避免越界 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]; return 0;}
高精度减法
#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;//判断大小的函数bool cmp(vector<int> A,vector<int> 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;}//高精度减法模板// C = A - B, 满足A >= B, A >= 0, B >= 0vector<int> sub(vector<int> &A,vector<int> &B){ vector<int> C; int len = A.size(); int t=0; for(int i=0;i<len ;i++) { t+=A[i]; if (i < B.size()) t -= B[i]; C.push_back((t+10)%10); //这里很巧妙 ,就包括了t<0这种情况 if(t<0) t=-1; //模拟进位 else t=0; } while(C.size()>1&&C.back()==0) C.pop_back(); //记得除去前导零 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'); if(cmp(A,B)) //先判断大小,执行的是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); printf("-"); //如果A>B的话,加个符号就好啦 for(int i=C.size()-1;i>=0;i--) cout<<C[i]; } return 0;}
高精度乘法
#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;//高精度乘法模板// C = A * b, A >= 0, b >= 0vector<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(); //0*1223 = 0 除去前导零 return C;}int main(){ string s; int b; vector<int> A; cin>>s>>b; for(int i=s.size()-1;i>=0;i--) A.push_back(s[i]-'0');//不要忘记减去0 auto C = mul(A,b); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; return 0;}
高精度除法
#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;//高精度除法模板// A / b = C ... r, A >= 0, b > 0vector<int> div(vector<int> A,int b,int &r){ vector<int> C; 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;int b; cin>>a>>b; vector<int> A;int r=0;//r是余数 for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); auto C = div(A,b,r); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; cout<<endl<<r; return 0;}