基础算法
高精度
1.791. 高精度加法
-
题目描述
-
思路
-
代码
-
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> using namespace std; const int N = 1e6 + 10; vector<int> add(vector<int> &A , vector<int> &B){ vector<int> C; int t = 0; //t表示进位 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]; //此时 t = 当前位数的加和 + 进位 C.push_back(t % 10); //如果 t / 10 = 1,就代表下一位需要进位1 t /= 10; } // ex: 12 + 90 避免第三位数 102中的1 被遗漏 if(t) C.push_back(1); return C; } int main(){ string a , b; vector<int> A , B ; cin >> a >> b; // a = "123456" //逆序遍历 for(int i = a.size()-1 ; i >=0 ; i--) A.push_back(a[i] - '0'); //A = [6,5,4,3,2,1] 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; }
-
2.792. 高精度减法
-
题目描述
-
思路
-
代码
-
#include<iostream> #include<vector> using namespace std; //我们假定的A 与 B 都是正数 //用于判断A B大小的函数 bool cmp(vector<int> &A , vector<int> &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; } //C = A - B vector<int> sub(vector<int> &A , vector<int> &B){ vector<int> C; //从个位开始减 for(int i = 0 , t = 0; i < A.size() ; i++){ //如果上一位借位了 ,那当前位就需要减去t t = A[i] - t; if(i < B.size()) t -= B[i]; C.push_back((t + 10) % 10); //t小于0 就代表需要借位 if( t < 0) t = 1; else t = 0; } while(C.size() > 1 && C.back() == 0) C.pop_back(); //去掉前导 0 ex 003 -> 3 return C; } int main(){ string a , b; vector<int> A , B ; cin >> a >> b; // a = "123456" //逆序遍历 for(int i = a.size()-1 ; i >=0 ; i--) A.push_back(a[i] - '0'); //A = [6,5,4,3,2,1] for(int i = b.size()-1 ; i >=0 ; i--) B.push_back(b[i] - '0'); //比较 A 与 B 的数字大小 if(cmp(A,B)){ vector<int> C = sub(A,B); for(int i = C.size() - 1 ; i >= 0 ; i --) printf("%d" , C[i]); } else{ vector<int> C = sub(B,A); printf("-"); for(int i = C.size() - 1 ; i >= 0 ; i--) printf("%d" , C[i]); } return 0; }
-
3.793. 高精度乘法
-
题目描述
-
思路
-
代码
-
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> using namespace std; C = A * B vector<int> mul(vector<int> &A , int b){ vector<int> C; int t = 0; //表示进位 //ex : 12 * 9 = 108 防止因为迭代次数缺少 , 而无法显示 1 for(int i = 0 ; i < A.size() || t ; i++){ //判断是否枚举完 if( i < A.size()) t += A[i] * b; C.push_back(t % 10); t /= 10; } //去掉前导0 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 = mul(A,b); for(int i = C.size() - 1 ; i >= 0 ; i--) printf("%d" , C[i]); return 0; }
-
4.794. 高精度除法
-
题目描述
-
思路
-
代码
-
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> using namespace std; //r表示余数 A/b, 商是C ,余数是 r , 除法需要从最高位开始算 vector<int> div(vector<int> &A , int b ,int &r){ vector<int> C; r = 0; for(int i = A.size() - 1 ; i >= 0 ; i--){ r = r * 10 + A[i]; //上一位的余数乘以10 加上 当前位数A[i] C.push_back(r/b); r %= b; } reverse(C.begin(),C.end()); //消除前导0 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'); //字符数组转整数 int r ; vector<int> C = div(A,b,r); for(int i = C.size() - 1 ; i >= 0 ; i--) printf("%d" , C[i]); cout << endl << r << endl; return 0; }
-