高精度加法分类

发布时间 2023-10-31 23:37:58作者: rw156

 两个高精度相加

 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 }