快排是小范围插入排序,大范围是快排
java是大整数类
python是无限大
大整数
浮点数的话就不讲了
高精度相加
vector自带size
加引用就不会引用一遍
c11-for循环范围遍历,迭代器或者vector
一个变量list,迭代器,vector
大黄鸭测试法,自动判断是什么类型是什么
压位
可能加减乘除同时运行
strlen,str.length().前者on,后者o1
没压位就是没有万进制什么的 ``` #include <cstdio> #include <cstring> #include <iostream> #include <vector> using namespace std; vector<int> add(vector<int> &A, vector<int> &B) // 用引用是为了不用复制一遍 { //if (A.size() < B.size()) return add(B, A); 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, 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 就是a-b
a<b 就是 -(b-a)
秦同学还是初中,小学就开始学了
#include <cstdio> #include <iostream> #include <vector> using namespace std; bool cmp(vector<int> &A, vector<int> &B) { // 判断左边是不是大于右边 if(A.size() != B.size()) return A.size() > B.size(); for(int i = A.size(); i >= 0; i--) { if(A[i] != B[i]) return A[i] > B[i]; // if(A[i] < B[i]) return false; // 不能判断等于因为等于是要全部一样 // if(A[i] > B[i]) return true; } return 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); 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; 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'); if(cmp(A, B)) { vector<int> C = sub(A, B); for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); // size - 1 } else { // 如果加减法里面有负号的话,可以事先判断 vector<int> C = sub(B, A); printf("-"); for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); } return 0; }
高精度乘法
那么它们的乘积最多18位数,可以用long long存储,就不需要写高精度了
#include <cstdio> #include <iostream> #include <algorithm> #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; } 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 = mul(A, b); for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); return 0; }
高精度除法
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> using namespace std; vector<int> div(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 = r % B; } reverse(C.begin(), C.end()); // begin和end是返回地址的 while(C.size() > 1 && C.back() == 0) C.pop_back(); return C; } int main() { string a; vector<int> A; int b; cin >> a >> b; for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); int r = 0; vector<int> C = div(A, b, r); for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); printf("\n%d", r); return 0; }
来源:https://www.cnblogs.com/WalterJ726/p/12365417.html