- 高精度+高精度
- 高精度-高精度
- 高精度*低精度
- 高精度/低精度
实际上高精度就是说参与运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算。这个时候,如果要得到正确的计算结果,显然不能依靠普通方法实现了,需要使用高精度的计算了。
重点:
1.使用字符来存储数据
2.将字符串从后向前存,因为加法可能有进位,数组在末尾是很容易插入数据的
高精度加法题目链接,点击直达
代码如下:
#include#include #include using namespace std; vector add(vector &A, vector &B) { vector 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);//若做高位还有进位,则要补1 return C; } int main() { vector A,B; string 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 = add(A,B); for(int i = C.size()-1;i >= 0;--i) cout< 高精度-高精度 题目链接,点击直达
代码如下:
#include#include #include using namespace std; //比较2个数的大小 bool cmp(vector &A, vector &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; } vector sub(vector &A, vector &B) { vector C; int t = 0; for(int i = 0; i < A.size();++i) { t = A[i] - t; //A[i] - B[i] - t if(i < B.size()) t -= B[i]; C.push_back((t+10)%10); //把t < 0,和t >=0合并 if(t < 0) t = 1; else t = 0; } while(C.size() > 1 && C.back() == 0) C.pop_back();//去掉前导0 return C; } int main() { vector A,B; string 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'); vector C; if(cmp(A,B)) { C = sub(A,B); } else { C = sub(B,A); cout<<"-"; } for(int i = C.size()-1;i >= 0;--i) cout< 高精度*低精度 题目链接,点击直达
代码如下:
#include高精度/低精度#include #include using namespace std; vector mul(vector &A, int b) { vector 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(); 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; } 题目链接,点击直达
代码如下:
#include#include #include using namespace std; vector div(vector &A, int b,int& r) { vector C; r = 0; 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 A; for(int i = a.size()-1;i >= 0;--i) A.push_back(a[i] - '0'); int r; auto C = div(A,b,r); for(int i = C.size()-1;i >= 0;--i) { printf("%d",C[i]); } cout<



