高精度算法分类
两个高精度相加
1 #include <vector> 2 #include<iostream> 3 using namespace std; 4 5 const int N = 1e6 + 10; 6 7 // C = A + B, A >= 0, B >= 0 8 vector<int> add(vector<int> &A, vector<int> &B) 9 { 10 vector<int> C; 11 int t = 0; //表示进位 12 for (int i = 0; i < A.size() || i < B.size(); i ++ )//当A和B没有读完时继续读入 13 { 14 if(i < A.size()) t += A[i]; //A没读完继续读A的每一位 15 if(i < B.size()) t += B[i]; 16 C.push_back(t % 10); 17 t /= 10; 18 // C [i] = A[i] + B[i] + t; 19 }
// if(A.size() < B.size()) return add(B,A); //保证A的位数一定多
// for循环条件只有 < B.size()即可
// 循环内少一个判断,即 t += A;
//if(i < B.size()) t += B[i];
20 21 if (t) C.push_back(1); //最高位要进位即多输出一位 1; 22 return C; //此时输出的C的数组下标也与位数相反 23 } 24 25 26 27 int main() 28 { 29 string a,b; 30 vector<int> A,B; //等价为数组 31 32 cin >> a >> b; // a = "123456" 33 //将a,b中的字符转化为数字 34 for (int i = a.size() - 1; i >= 0 ; i -- ) A.push_back(a[i] - '0');// A[6,5,4,3,2,1] 35 for (int i = b.size() - 1; i >= 0 ; i -- ) B.push_back(b[i] - '0'); 36 37 auto C = add(A,B); 38 39 for (int i = C.size() - 1; i >= 0; i -- ) printf("%d",C[i]); //将反着的C数组输出,表示相加后的位数 40 }
高精度减法
1 #include<vector> 2 #include<iostream> 3 using namespace std; 4 5 const int N = 1e6 + 10; 6 7 bool cmp(vector<int> &A,vector<int> &B) 8 { 9 if(A.size() != B.size()) return A.size() > B.size();//当位数不相等时,位数大的为大 10 for (int i = A.size() - 1; i >= 0; i -- ) //位数相等从最高位开始判断(最高位在数组的下标的末端开始) 11 { 12 if(A[i] != B[i]) 13 return A[i] > B[i]; //判断相同位置上的数谁大,返回大的值,使得大 - 小 14 } 15 return true; 16 } 17 18 19 vector<int> sub(vector<int> &A, vector<int> &B) // C = A - B, A >= 0, B >= 0 20 { 21 vector<int> C; //定义答案数组 22 for (int i = 0,t = 0; i < A.size(); i ++ ) //从个位开始减,t表示借位 23 { 24 t = A[i] - t; 25 if(i < B.size()) t -= B[i]; 26 C.push_back((t + 10) % 10); //同时满足 t > 0 和 t < 0时为t + 10 的情况 27 if(t < 0) t = 1;// t < 0 说明位数上的数不够减,往前借一位,前一位数字减1 28 else t = 0; //否则不变 29 // t = A[i] - B[i] - t ; 30 } 31 while(C.size() > 1 && C.back() == 0) C.pop_back(); 32 33 return C; 34 } 35 36 37 int main() 38 { 39 string a,b; 40 vector<int> A,B; 41 cin >> a >> b; 42 43 for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0'); 44 for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0'); 45 46 if (cmp(A,B)) //判断A和B的大小,避免小数减大数 47 { 48 //A > B 49 auto C = sub(A,B); 50 for (int i = C.size() - 1; i >= 0; i -- ) printf("%d",C[i]); 51 } 52 else 53 { 54 //B > A时 交换A和B数组 55 auto C = sub(B,A); 56 57 printf("-"); 58 for (int i = C.size() - 1; i >= 0; i -- ) printf("%d",C[i]); 59 } 60 61 62 63 return 0; 64 }
高精度乘 低精度
1#include<iostream>
2 #include <vector>
3 using namespace std;
4
5 int b;
6
7 //C = A * b;
8 vector<int> mul(vector<int> &A,int b)
9 {
10 vector<int> C;
11 int t = 0;
12 for (int i = 0; i < A.size() || t; i ++ ) //i还没有循环完就继续做
13 {
14 if(i < A.size()) t += A[i] * b; //此时A还没遍历完
15 C.push_back(t % 10); //分离出个位
16 t /= 10; //与加法不同的是这里t可能是各种数字,加法只能为 0 或 1,表示进位
17 }
18
19 return C;
20 }
21
22
23 int main()
24 {
25 string a;//"123456"
26 cin >> a >> b;
27
28 vector<int> A;
29 for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');//A[6,5,4,3,2,1]
30
31 auto C = mul(A,b);
32
33 for (int i = C.size() - 1; i >= 0 ; i -- ) printf("%d",C[i]);
34 return 0;
35 }
高精度除法
1 #include<iostream> 2 #include <vector> 3 #include<algorithm> 4 using namespace std; 5 6 int b; 7 8 //C = A / b; 9 vector<int> div(vector<int> &A,int b,int &r) 10 { 11 vector<int> C; 12 r = 0; 13 for (int i = A.size() - 1; i >= 0 ; i -- ) 14 { 15 r = r *10 + A[i]; //表示余数 16 C.push_back(r / b); //商 17 r %= b; //余数 18 } 19 reverse(C.begin(),C.end()); //因为C读入是反着的,这里反转数组才能从最高位开始读 20 21 while(C.size() > 1 && C.back() == 0) C.pop_back(); //去掉前导0 22 23 return C; 24 } 25 26 27 int main() 28 { 29 string a;//"123456" 30 cin >> a >> b; 31 32 vector<int> A; 33 for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');//A[6,5,4,3,2,1] 34 35 int r; 36 auto C = div(A,b,r); 37 38 for (int i = C.size() - 1; i >= 0 ; i -- ) printf("%d",C[i]); 39 cout << endl << r << endl; 40 return 0; 41 42 } 43