高精度大整数计算
两个高精度大整数相加
简单分析
由于两个都是大整数,需要用数组或容器来存。具体运算就跟手算一样,各位相加留下10的余数多于10的进位,从个位开始一直重复到最高位即可,最后需要注意进位是否还多出一位来。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include<iostream> #include<stdio.h> #include<string> #include<vector> using namespace 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(t); return c; }
int main(){ string a,b; vector<int> A; vector<int> 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'); vector<int> c = add(A,B); for(int i = c.size() - 1;i >= 0;i--)printf("%d",c[i]); return 0; }
|
两个高精度大整数相减
简单分析
同样由于两个都是大整数,需要用数组或容器来存。具体运算就跟手算一样,首先保证A要大于等于B,然后设t为借位,还是从低位到高位每次将A的各位 - B的各位 - 借位t,将其对10求余则为两数差该位的答案,再由其正负确定是否向高位借位。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <iostream> #include <string> #include <vector> using namespace std;
int cmp(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]; } } return 1; } } vector<int> sub(vector<int> &A,vector<int> &B){ vector<int> c; int t = 0; for(int i = 0;i < A.size();i++){ int temp = A[i] - t; if(i < B.size()) temp -= B[i]; c.push_back((temp + 10) % 10); if(temp >= 0)t = 0; else t = 1; } while(c.size() != 1 && c.back()==0)c.pop_back();
return c; }
int main() { 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'); vector<int> C = cmp(A,B) ? sub(A,B) : sub(B,A); if(!cmp(A,B))cout <<"-"; for(int i = C.size() - 1;i >= 0;i--)cout<<C[i]; return 0; }
|
高精度大整数乘小整数
简单分析
只有一个大整数所以只需要一个容器来存另一个用整数即可,与手算有点点区别,还是从低位到高位依次用大整数的每一位乘以小数b得到一个小整数,将其对10求余就是该位的答案并将多余的进位运算,同样注意前缀0问题;
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <iostream> #include <string> #include <vector> 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; c.push_back(t%10); t /= 10; } while(c.size() != 1 && c.back() == 0)c.pop_back(); }
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'); vector<int> C = mul(A,b); for(int i = C.size() - 1;i >= 0;i--)cout<<C[i]; return 0; }
|
高精度大整数除以小整数
简单分析
只有一个大整数所以只需要一个容器来存另一个用整数即可,与手算有区别,从高位开始算,将每一位加上上一位的余数*10除以b,继续将余数留给下一位,直到大数的每一位计算完,需要注意答案是从高位到低位排列的,要去除前缀0需要先逆置;
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; int r;
vector<int> div(vector<int> A,int b){ vector<int> c; int t=0; for(int i = A.size() - 1;i >= 0;i--){ int temp = t*10 + A[i]; c.push_back(temp / b); t = temp % b; } r = t; 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; for(int i = a.size() - 1;i >=0;i--)A.push_back(a[i] - '0'); vector<int> C = div(A,b); for(int i = C.size() - 1;i >=0;i--)cout<<C[i]; cout<<endl<<r; return 0; }
|