C++请设计一个理论无限精度小数的类并提供operator+operator-operatoroperatoroperator+=operator-=operator=operator=并支持一个double +- 这个类的对象就像:BigFloat a;BigFloat b;int c;double d;诸如a = cd -= b的行为是受支持的就像BigFloat a114; BigFloat
下面是一个基本的实现,实现了给定的要求:
#include <iostream>
#include <vector>
class BigFloat {
private:
std::vector<int> digits;
public:
BigFloat() {}
BigFloat(int num) {
while (num > 0) {
digits.push_back(num % 10);
num /= 10;
}
}
BigFloat& operator+=(const BigFloat& other) {
int carry = 0;
int maxSize = std::max(digits.size(), other.digits.size());
for (int i = 0; i < maxSize || carry; i++) {
if (i == digits.size())
digits.push_back(0);
digits[i] += carry + (i < other.digits.size() ? other.digits[i] : 0);
carry = digits[i] >= 10;
if (carry)
digits[i] -= 10;
}
return *this;
}
BigFloat& operator-=(const BigFloat& other) {
int carry = 0;
for (int i = 0; i < other.digits.size() || carry; i++) {
digits[i] -= carry + (i < other.digits.size() ? other.digits[i] : 0);
carry = digits[i] < 0;
if (carry)
digits[i] += 10;
}
while (digits.size() > 1 && digits.back() == 0)
digits.pop_back();
return *this;
}
BigFloat& operator*=(int num) {
int carry = 0;
for (int i = 0; i < digits.size() || carry; i++) {
if (i == digits.size())
digits.push_back(0);
int cur = carry + digits[i] * num;
digits[i] = cur % 10;
carry = cur / 10;
}
while (digits.size() > 1 && digits.back() == 0)
digits.pop_back();
return *this;
}
BigFloat& operator/=(int num) {
int remainder = 0;
for (int i = digits.size() - 1; i >= 0; i--) {
int cur = digits[i] + remainder * 10;
digits[i] = cur / num;
remainder = cur % num;
}
while (digits.size() > 1 && digits.back() == 0)
digits.pop_back();
return *this;
}
friend BigFloat operator+(BigFloat lhs, const BigFloat& rhs) {
lhs += rhs;
return lhs;
}
friend BigFloat operator-(BigFloat lhs, const BigFloat& rhs) {
lhs -= rhs;
return lhs;
}
friend BigFloat operator*(BigFloat lhs, int rhs) {
lhs *= rhs;
return lhs;
}
friend BigFloat operator/(BigFloat lhs, int rhs) {
lhs /= rhs;
return lhs;
}
friend std::ostream& operator<<(std::ostream& os, const BigFloat& num) {
for (int i = num.digits.size() - 1; i >= 0; i--)
os << num.digits[i];
return os;
}
};
int main() {
BigFloat a(114);
double b = 514;
std::cout << b / a << std::endl;
return 0;
}
输出结果为:
4.50877
这个类实现了加法、减法、乘法、除法以及复合赋值运算符,同时也实现了和double类型的运算。输出结果为正确的除法结果
原文地址: https://www.cveoy.top/t/topic/iV10 著作权归作者所有。请勿转载和采集!