1.高精度加法
题目
直接用数组模拟相加的过程
代码
#include <bits/stdc++.h> using namespace std; vector<int> Badd(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>0) C.push_back(1); //最后一位有进位的情况 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'); auto C=Badd(A,B); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); return 0; }
2.高精度减法
题目
代码:
直接用数组模拟相减的过程
#include <bits/stdc++.h> using namespace std; 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'); int fa=0; //标记符号 if(a.size()>b.size()) C=sub(A,B); else if (a.size()==b.size()) if(a>=b) C=sub(A,B); else { C=sub(B,A); fa=1; } else { C=sub(B,A); fa=1; } if(fa) cout<<'-'; //输出负号 for(int i=C.size()-1;i>=0;i--) cout<<C[i]; return 0; }
3.高精度乘法
题目
代码
乘法的运算过程:
本位=(进位+相乘)%10
进位=(进位+相乘)/10
#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()||t;i++) { if(i<A.size()) t=A[i]*b+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; int b; cin>>a>>b; vector<int> A; for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); auto C=mul(A,b); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); return 0; }
4.高精度除法
题目
代码
#include <bits/stdc++.h> using namespace std; vector<int> Cdiv(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(); //去除前导0 return C; } int main() { 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'); int r=0; //定义余数 auto C=Cdiv(A,b,r); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); cout<<endl<<r; return 0; }