//两个大整数相加#include<bits/stdc++.h>usingnamespace std;
vector<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(1)//最后如果t不为0,那么说明还有进位(最高一位)return c;}intmain(){
string a, b;
cin>>a>>b;
vector<int> 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');auto c =Add(A, B);for(int i = c.size()-1; i >=0; i--)
cout<<c[i];return0;}
高精度减法
模板如下
#include<iostream>#include<vector>usingnamespace std;boolcmp(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--)//当A与B位数相等,从最高位往下判if(A[i]!=B[i])return A[i]> B[i];returntrue;//别忘了。全对也是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);//正负和二为1if(t<0) t =1;else t =0;}while(c.size()>1&& c.back()==0)//去掉前导0
c.pop_back();return c;}intmain(){
string n, m;
cin>>n>>m;
vector<int>A, B;for(int i = n.size()-1; i>=0; i--) A.push_back(n[i]-'0');for(int i = m.size()-1; i>=0; i--) B.push_back(m[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);
cout<<"-";for(int i = c.size()-1; i>=0; i--) cout<<c[i];}return0;}
高精度*小整数
此为高精度乘低精度的乘法。
vector<int> c;//不存在当b=9999时,进位很大,导致最高位输出相反。因为最高位输出eg:500,低位3,4,5,...照常。int t =0;//进位标志&数量for(int i =0; i < A.size(); i++){
t = t + A[i]*b;//进位+当位乘积
c.push_back(t%10);//只保留最低位
t /=10;}//勿忘最高位if(t) c.push_back(t);while(c.size()>1&& c.back()==0) c.pop_back();return c;}intmain(){
string a;int b;
cin>>a>>b;
vector<int> A;for(int i = a.size()-1; i>=0; i--) A.push_back(a[i]-'0');//勿忘减掉'0'auto c =mul(A, b);for(int i = c.size()-1; i>=0; i --)
cout<<c[i];return0;}
高精度/低精度
此为高精度除低精度
#include<iostream>#include<vector>#include<algorithm>usingnamespace std;
vector<int>div(vector<int>& A,int b,int& r)//r余数{
vector<int> c;//商for(int i = A.size()-1; i>=0; i--)//除法从高位到低位,所以反过来{
r = r*10+ A[i];//r*10,高位。
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 num;
vector<int> A;
cin>>a>>num;for(int c = a.size()-1; c >=0; c--) A.push_back(a[c]-'0');int r =0;//余数auto k =div(A, num, r);for(int i = k.size()-1; i>=0; i--) cout<<k[i];//cout<<endl;//cout<<r;return0;}