90pts,#10WA求助
查看原帖
90pts,#10WA求助
1074084
asd890123楼主2024/6/5 17:10
#include <iostream>
#include <cstring>
#include <string> 

constexpr int maxn = 2e4 + 5;

struct BigInterger{
    
    int a[maxn],len,sign = 1;
    
    int &operator[](int i){return a[i];}
    
    BigInterger(int x = 0){
        
        memset(a,0,sizeof(a));
        for (len = 1;x;len++)
            a[len] = x % 10,x /= 10;
        len--;
        
    }
    
    BigInterger &operator=(int x){return *this = BigInterger(x);}
    
    void flatten(int l){
        
        len = l;
        for (int i = 1;i <= len;i++)
            a[i + 1] += a[i] / 10,a[i] %= 10;
        while (!a[len] && len > 1) len--;
        
    }
    
    void borrow(int l){
        
        len = l;
        for (int i = 1;i <= len;i++)
            while (a[i] < 0)
                a[i + 1]--,a[i] += 10;
        flatten(l);
        
    }
    
    bool operator>(BigInterger x){
        
        if (x.len != len) return len > x.len;
        for (int i = len;i;i--)
            if (x[i] != a[i])
                return a[i] > x[i];
        
        return 0;
    }
    
    BigInterger operator+(BigInterger x){
        
        BigInterger ans;
        
        for (int i = 1;i <= std::max(x.len,len);i++) ans[i] = a[i] + x[i];
        ans.flatten(std::max(x.len,len) + 1);
        
        return ans;
    }
    
    BigInterger operator-(BigInterger x){
        
        BigInterger ans;
        
        if (x > *this){
            
            ans = x - *this;
            ans.sign = -1;
            return ans;
            
        }
        for (int i = 1;i <= std::max(len,x.len);i++) ans[i] = a[i] - x[i];
        ans.borrow(std::max(len,x.len));
        
        return ans;
    }
    
    BigInterger operator*(BigInterger x){
        
        BigInterger ans;
        
        for (int i = 1;i <= len;i++)
            for (int j = 1;j <= x.len;j++)
                ans[i + j - 1] += a[i] * x[j];
        ans.flatten(len + x.len + 1);
        
        return ans;
    }
    
    BigInterger operator*(int x){
        
        BigInterger ans;
        
        for (int i = 1;i <= len;i++) ans[i] = a[i] * x;
        ans.flatten(len + 11);
        
        return ans;
    }
    
    int operator/(BigInterger x){
        
        int l = 1,r = 1e9,mid,ans;
        
        while (l <= r){
            
            mid = (l + r) / 2;
            if (x * mid > *this) ans = mid,r = mid - 1;
            else l = mid + 1;
            
        }
        
        return ans - 1;
    }
    
    BigInterger operator%(BigInterger x){return *this - x * (*this / x);}
    
};

std::istream &operator>>(std::istream &is,BigInterger &x){
    
    std::string s;
    
    is >> s;
    x.len = s.length();
    for (int i = 1,j = x.len - 1;j >= 0;i++,j--) x[i] = s[j] - '0';
    
    return is;
}

std::ostream &operator<<(std::ostream &os,BigInterger x){
    
    if (x.sign == -1) os << '-';
    for (int i = x.len;i;i--) os << x[i];
    
    return os;
}

int main(){
    
    BigInterger a,b;
    
    std::cin >> a >> b;
    std::cout << a + b << '\n';
    std::cout << a - b << '\n';
    std::cout << a * b << '\n';
    std::cout << a / b << '\n';
    std::cout << a % b << '\n';
    
    return 0;
}

问题出在第四行,应该是除法的重载有问题,所以重点看下除法就行

2024/6/5 17:10
加载中...