求救!
  • 板块学术版
  • 楼主AKkkk_TIX
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/6/10 11:44
  • 上次更新2024/6/10 15:23:17
查看原帖
求救!
1041765
AKkkk_TIX楼主2024/6/10 11:44

求救!

最近脑子抽抽 脑浆爆满了,想写个重载运算符高精加减乘除,但那问题真的超超超多,有没有巨/大/中/小 佬帮忙看看:

#include <bits/stdc++.h>

using namespace std;

// 定义大整数最大位数
const int MAX_DIGITS = 1000;

// 大整数结构体
struct BigInteger {
    char digits[MAX_DIGITS]; // 数字数组
    int numDigits;           // 数字位数
    bool isNegative;         // 是否为负数

    // 默认构造函数,初始化大整数为0
    BigInteger() : numDigits(1), isNegative(false) {
        // 将数字数组初始化为0
        for (int i = 0; i < MAX_DIGITS; ++i)
            digits[i] = 0;
    }

    // 根据字符串构造大整数
    BigInteger(const string& numStr) : numDigits(0), isNegative(false) {
        // 遍历字符串中的每个字符,并将其转换为数字存储到数组中
        int len = strlen(numStr.c_str());
        if (len > 0 && numStr[0] == '-') {
            isNegative = true;
            len--; // 负号不计入位数
        }
        for (int i = len - 1; i >= 0; --i)
            digits[numDigits++] = numStr[i] - '0';
    }

    	// 加法运算符重载,接受整数参数
    BigInteger operator+(int num) {
        // 将整数转换为大整数,然后执行加法运算
        BigInteger numBigInt(to_string(num));
        return (*this) + numBigInt;
    }
    
    // 减法运算符重载,接受整数参数
    BigInteger operator-(int num) {
        // 将整数转换为大整数,然后执行减法运算
        BigInteger numBigInt(to_string(num));
        return (*this) - numBigInt;
    }
    
    // 乘法运算符重载,接受整数参数
    BigInteger operator*(int num) {
        // 将整数转换为大整数,然后执行乘法运算
        BigInteger numBigInt(to_string(num));
        return (*this) * numBigInt;
    }

	// 除法运算符重载,接受整数参数
    BigInteger operator/(int num) {
        // 将整数转换为大整数,然后执行除法运算
        BigInteger numBigInt(to_string(num));
        return (*this) / numBigInt;
    }
	
	
	 
    // 加法运算符重载
    BigInteger operator+(BigInteger& other) {
        BigInteger result; // 结果大整数
        int carry = 0;     // 进位
        int maxDigits = max(numDigits, other.numDigits); // 获取两个大整数中的最大位数
        // 逐位相加
        for (int i = 0; i < maxDigits || carry; ++i) {
            int sum = carry;
            if (i < numDigits) sum += digits[i];
            if (i < other.numDigits) sum += other.digits[i];
            result.digits[i] = sum % 10;
            carry = sum / 10;
            ++result.numDigits;
        }
        return result;
    }

    // 减法运算符重载
    BigInteger operator-(BigInteger& other) {
        BigInteger result; // 结果大整数
        int borrow = 0;    // 借位
        // 逐位相减
        for (int i = 0; i < numDigits; ++i) {
            int diff = digits[i] - borrow;
            if (i < other.numDigits) diff -= other.digits[i];
            if (diff < 0) {
                diff += 10;
                borrow = 1;
            } else {
                borrow = 0;
            }
            result.digits[i] = diff;
            ++result.numDigits;
        }
        // 移除结果中的前导零
        while (result.numDigits > 1 && result.digits[result.numDigits - 1] == 0)
            --result.numDigits;
        return result;
    }
    
	// 乘法运算符重载
	BigInteger operator*(BigInteger& other) {
	       BigInteger result; // 结果大整数
	       // 逐位相乘
	       for (int i = 0; i < numDigits; ++i) {
	           int carry = 0;
	           for (int j = 0; j < other.numDigits || carry; ++j) {
	               int product = result.digits[i + j] +
	                             digits[i] * (j < other.numDigits ? other.digits[j] : 0) + carry;
	               result.digits[i + j] = product % 10;
	               carry = product / 10;
	               // 更新结果的位数
	               if (i + j >= result.numDigits && product > 0)
	                   result.numDigits = i + j + 1;
	           }
	       }
	    return result;
	}
	    
	// 除法运算符重载
    BigInteger operator/(BigInteger& other) {
        BigInteger quotient, remainder; // 商和余数
        // 从高位到低位逐步计算商和余数
        for (int i = numDigits - 1; i >= 0; --i) {
            remainder = remainder * 10;
            remainder.digits[0] = digits[i];
            int x = 0, left = 0, right = 9;
            // 二分法找商
            while (left <= right) {
                int mid = (left + right) / 2;
                BigInteger temp = other * mid;
                if (temp.digits[0] <= remainder.digits[0]) {
                    x = mid;
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
            quotient = quotient * 10 + x;
            remainder = remainder - other * x;
        }
        return quotient;
    }

    


    // 输出运算符重载
    friend ostream& operator<<(ostream& os, BigInteger& num) {
        if (num.isNegative && !(num.numDigits == 1 && num.digits[0] == 0))
            os << "-"; // 如果是负数且不是零,则输出负号
        // 逐位输出数字
        for (int i = num.numDigits - 1; i >= 0; --i)
            os << (char)(num.digits[i] + '0');
        return os;
    }
};

int main() {
    // 测试用例
    BigInteger num1,num2; 
    cin >> num1 >> num2;
    

    // 输出结果
    cout << "num1 + num2 = " << num1 + num2 << endl;
    cout << "num1 - num2 = " << num1 - num2 << endl;
    cout << "num1 * num2 = " << num1 * num2 << endl;
    cout << "num1 / num2 = " << num1 / num2 << endl;

    return 0;
}

谢谢!

2024/6/10 11:44
加载中...