东拼西凑的代码
本人的__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;
}