高精度
高精度加法
高精度加法采用数组的形式进行存储和运算,数组a[0]存储个位数,a[1]存储十位数
int Add(int a[], int b[], int c[], int cnt) {
int t = 0;//t表示进位
 for (int i=1; i<=cnt; i++) {
        t += a[i] + b[i];//进位加上a和b第i位上的数
        c[i] = t % 10;//c的值就是进位的个位数
        t /= 10;//把t的个位数去掉只剩下十位数,即只剩下这个位置的进位
    }
    if (t) c[++cnt] = 1;//如果t==1,表示还有一个进位,要补上
    return cnt;
}
int main() {
    string a, b;
    cin >> a >> b;  
    //A和B倒着放进int数组,因为有进位,倒着放容易处理
    int cnt1 = 0;
    for (int i=a.size()-1; i>=0; i--)
        A[++cnt1] = a[i] - '0';
    int cnt2 = 0;
    for (int i=b.size()-1; i>=0; i--)
        B[++cnt2] = b[i] - '0';
int tot = Add(A, B, C, max(cnt1, cnt2));
    //因为A和B是倒着放的,所以C也要倒着输出
    for (int i=tot; i>=1; i--)
        cout << C[i];
}
高精度减法
对于 t = A[i] - B[i] - t; 可以拆为 t = A[i] - t如果B[i]合法,再t -= B[i] 这么两步来做
相减后t的处理 ,把 t >=0 和 t < 0 用一个式子来表示 t = (t + 10) % 10 这个木有想到
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 ); // 合而为1
        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;
    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');
    if (a.size() < b.size()) 
    {
        auto C = sub(B, A);
        printf("-");
        for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
        return 0;
    }
    if (a.size() == b.size())
    {
        for(int i = a.size() -1 ; i >= 0; i --)
            if(A[i] != B[i]) 
            {  
                if(A[i] < B[i])
                {
                    auto C = sub(B, A);
                    printf("-");
                    for(int j = C.size() - 1; j >= 0; j--) printf("%d", C[j]);
                    return 0;
                }
                else
                {
                    auto C = sub(A, B);
                    for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
                    return 0;
                }
            }
    }
    auto C = sub(A, B);
    for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
    return 0;
}
高精度乘法
C=(3*12)%10 个位
t=(3*12)/10 进位
高精度除法
r*10+A 余数
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号