__int512
  • 板块灌水区
  • 楼主kuakuafor1
  • 当前回复14
  • 已保存回复14
  • 发布时间2024/7/16 15:44
  • 上次更新2024/7/16 16:23:34
查看原帖
__int512
982450
kuakuafor1楼主2024/7/16 15:44

东拼西凑的代码

本人的__int512的已知问题:

内存开销太大,在进行运算时最后一位会补一个零

(需要使用string代替输入如:

string s;
cin>>s; 
__int512 a(s);
cout<<a; 

)

#include<bits/stdc++.h>
#define __int512 Int512
using namespace std; 
class Int512 {
private:
	std::vector<int> digits;
	bool isNegative;
	
	void removeLeadingZeros() {
		while (digits.size() > 1 && digits.back() == 0) {
			digits.pop_back();
		}
		if (digits.size() == 1 && digits[0] == 0) {
			isNegative = false;
		}
	}
	
public:
	Int512() : isNegative(false) {
		digits.push_back(0);
	}
	
	Int512(const std::string& str) {
		isNegative = (str[0] == '-');
		for (int i = str.size() - 1; i >= (isNegative ? 1 : 0); --i) {
			digits.push_back(str[i] - '0');
		}
		removeLeadingZeros();
	}
	
	Int512 operator+(const Int512& other) const {
		if (isNegative == other.isNegative) {
			Int512 result;
			result.isNegative = isNegative;
			int carry = 0;
			for (size_t i = 0; i < digits.size() || i < other.digits.size() || carry; ++i) {
				int sum = carry;
				if (i < digits.size()) sum += digits[i];
				if (i < other.digits.size()) sum += other.digits[i];
				result.digits.push_back(sum % 10);
				carry = sum / 10;
			}
			return result;
		} else {
			return *this - (-other);
		}
	}
	
	Int512 operator-(const Int512& other) const {
		if (isNegative == other.isNegative) {
			if (abs() >= other.abs()) {
				Int512 result;
				result.isNegative = isNegative;
				int borrow = 0;
				for (size_t i = 0; i < digits.size(); ++i) {
					int diff = digits[i] - borrow;
					if (i < other.digits.size()) diff -= other.digits[i];
					if (diff < 0) {
						diff += 10;
						borrow = 1;
					} else {
						borrow = 0;
					}
					result.digits.push_back(diff);
				}
				
				result.removeLeadingZeros();
				return result;
			} else {
				return -(other - *this);
			}
		} else {
			return *this + (-other);
		}
	}
	
	Int512 operator*(const Int512& other) const {
		Int512 result;
		result.digits.resize(digits.size() + other.digits.size(), 0);
		result.isNegative = (isNegative != other.isNegative);
		for (size_t i = 0; i < digits.size(); ++i) {
			for (size_t j = 0; j < other.digits.size(); ++j) {
				result.digits[i + j] += digits[i] * other.digits[j];
				if (result.digits[i + j] >= 10) {
					result.digits[i + j + 1] += result.digits[i + j] / 10;
					result.digits[i + j] %= 10;
				}
			}
		}
		result.removeLeadingZeros();
		return result;
	}
	
	Int512 operator/(const Int512& other) const {
		if (other == Int512("0")) throw std::runtime_error("Division by zero");
		Int512 result, remainder;
		result.isNegative = (isNegative != other.isNegative);
		remainder.isNegative = isNegative;
		for (int i = digits.size() - 1; i >= 0; --i) {
			remainder.digits.insert(remainder.digits.begin(), digits[i]);
			remainder.removeLeadingZeros();
			int quotient = 0;
			while (remainder >= other.abs()) {
				remainder = remainder - other.abs();
				++quotient;
			}
			result.digits.insert(result.digits.begin(), quotient);
		}
		result.removeLeadingZeros();
		return result;
	}
	
	Int512 operator%(const Int512& other) const {
		return *this - (*this / other) * other;
	}
	
	Int512 abs() const {
		Int512 result = *this;
		result.isNegative = false;
		return result;
	}
	
	Int512 operator-() const {
		Int512 result = *this;
		result.isNegative = !isNegative;
		return result;
	}
	
	bool operator==(const Int512& other) const {
		return isNegative == other.isNegative && digits == other.digits;
	}
	
	bool operator!=(const Int512& other) const {
		return !(*this == other);
	}
	
	bool operator<(const Int512& other) const {
		if (isNegative != other.isNegative) return isNegative;
		if (digits.size() != other.digits.size()) return isNegative ? digits.size() > other.digits.size() : digits.size() < other.digits.size();
		for (int i = digits.size() - 1; i >= 0; --i) {
			if (digits[i] != other.digits[i]) return isNegative ? digits[i] > other.digits[i] : digits[i] < other.digits[i];
		}
		return false;
	}
	
	bool operator<=(const Int512& other) const {
		return *this < other || *this == other;
	}
	
	bool operator>(const Int512& other) const {
		return !(*this <= other);
	}
	
	bool operator>=(const Int512& other) const {
		return !(*this < other);
	}
	
	friend std::ostream& operator<<(std::ostream& os, const Int512& num) {
		if (num.isNegative) os << '-';
		for (int i = num.digits.size() - 1; i >= 0; --i) {
			os << num.digits[i];
		}
		return os;
	}
};
int main() {
	string get_a,get_b; 
	cin>>get_a>>get_b; 
	__int512 a(get_a);
	__int512 b(get_b);
	cout<<a+b; 
	return 0;
}
2024/7/16 15:44
加载中...