声明高精度加法高精度减法高精度乘法
高精乘低精度高精乘高精 高精度除法
高精度/低精度
声明高精度加法这篇文章的代码仅仅只是一个模板。
思想:和两数的加法类似(从小数位加加到大数位,),
一个数在数组里是倒着放,方便加法
性质:方便放
代码实现:
#include高精度减法#include #include using namespace std; vector add(vector &A,vector &B) { vector ret; int j=0;//进位 int n=A.size(); int m=B.size(); for (int i = 0; i < n||i >a,cin>>b; vector 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);//auto 为c++11的语法,也可以写成vector C=add(A,B); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);//逆序输出,得到两个大树的答案 return 0; }
和加法类似,只是需要注意前导0。
#include高精度乘法 高精乘低精度#include #include using namespace std; bool cmp(vector & A,vector & B) { int n=A.size(); int m=B.size(); if(n!=m) return n>m; for(int i=n-1;i>=0;i--) { if(A[i]!=B[i]) return A[i]>B[i]; } return true; } vector sub(vector & A,vector & B) { //由于前面进行了比较,所以这里A的值固定比B的大 vector ret; int n=A.size(); for (int i = 0,t=0; i < n; i ++ ) { t=A[i]-t; if(i 1&&ret.back()==0) ret.pop_back(); //删除前导0,两个数A和B的位数,且最高位数字一样,则会产生前导0;要删除掉 return ret; } int main() { string a,b; cin>>a>>b; vector 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--) printf("%d",C[i]); } else { auto C=sub(B,A); printf("-"); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); } return 0; }
#include高精乘高精#include #include using namespace std; vector mul(vector & A,int b) { vector C; int t=0; int n=A.size(); for (int i = 0; i < n||t; i ++ ) { if(i 1&&C.back()==0) C.pop_back(); return C; } int main() { string a; int b; cin>>a>>b; vector 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; }
两个数组倒着,和高精*低精类似 ,自己接两个数组的每个数先相乘后的值放到ret数组对应的位置里,先不管进制,后面在进行O(N)的处理进制,
//高精*高精 #include高精度除法 高精度/低精度#include #include using namespace std; vector mul(vector & A, vector & B) { vector ret(A.size()+B.size()); for (int i = 0; i < A.size() ; i++) for (int j = 0; j < B.size(); j++) ret[i + j] = A[i] * B[j]; int t = 0; for (int i = 0; i < ret.size() - 1; i++) { t += ret[i]; ret[i] = t % 10; t /= 10; } while (ret.size() > 1 && ret.back() == 0) ret.pop_back(); //删除前导0 return ret; } int main() { string a, b; cin >> a >> b; vector 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 = mul(A, B); for (int i = C.size() - 1; i >= 0; i--) { printf("%d", C[i]); } return 0; }
注意这次的A是由高为传输至低位,由于在除法的手算过程中,发现从高位进行处理,
#include#include #include #include using namespace std; vector mul(vector & A, int b) { vector ret; int r = 0;//r表示余数 //由最高位进行处理 for (int i = 0; i < A.size(); i++) { //将上次的余数*10在加上当前位的数字,便是该位需要除的被除数 r = r * 10 + A[i]; //所得即为商在这一位的数字 ret.push_back(r / b); r %= b; } //删除前面的0 reverse(ret.begin(), ret.end()); while (ret.size() > 1 && ret.back() == 0) ret.pop_back(); return ret; } int main() { string a; int b; cin >> a >> b; vector A; for (int i = 0; i < a.size(); 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; }
高精/高精
参考此链接参考此链接



