3行,包含3个高精度数,为梯形的上底、下底和高。输出梯形的面积,用C++解决,不能定义函数输入数必须为高精度数
时间: 2024-05-10 08:16:53 浏览: 6
以下是实现代码:
```c++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//高精度数的实现
class BigInt {
public:
BigInt() { num.push_back(0); } //默认构造函数,初始化为0
BigInt(long long x) { //将一个整数转换为高精度数
while (x > 0) {
num.push_back(x % 10);
x /= 10;
}
}
BigInt(const string& s) { //将一个字符串转换为高精度数
for (int i = s.size() - 1; i >= 0; i--) {
num.push_back(s[i] - '0');
}
}
bool operator<(const BigInt& b) const { //重载小于运算符
if (num.size() != b.num.size()) return num.size() < b.num.size();
for (int i = num.size() - 1; i >= 0; i--) {
if (num[i] != b.num[i]) return num[i] < b.num[i];
}
return false;
}
BigInt operator+(const BigInt& b) const { //重载加法运算符
BigInt res;
int carry = 0;
for (int i = 0; i < max(num.size(), b.num.size()); i++) {
if (i < num.size()) carry += num[i];
if (i < b.num.size()) carry += b.num[i];
res.num.push_back(carry % 10);
carry /= 10;
}
if (carry) res.num.push_back(carry);
return res;
}
BigInt operator*(const BigInt& b) const { //重载乘法运算符
BigInt res;
res.num.resize(num.size() + b.num.size());
for (int i = 0; i < num.size(); i++) {
int carry = 0;
for (int j = 0; j < b.num.size(); j++) {
int tmp = num[i] * b.num[j] + carry + res.num[i + j];
res.num[i + j] = tmp % 10;
carry = tmp / 10;
}
if (carry) res.num[i + b.num.size()] += carry;
}
while (res.num.size() > 1 && res.num.back() == 0) res.num.pop_back();
return res;
}
friend ostream& operator<<(ostream& out, const BigInt& x) { //重载输出运算符
for (int i = x.num.size() - 1; i >= 0; i--) {
out << x.num[i];
}
return out;
}
private:
vector<int> num; //存储高精度数的数组
};
int main() {
//读入三个高精度数
string s1, s2, s3;
cin >> s1 >> s2 >> s3;
BigInt a(s1), b(s2), h(s3);
//计算梯形面积并输出
cout << (a + b) * h / 2 << endl;
return 0;
}
```
这里使用了一个 `BigInt` 类来实现高精度数的加、乘和输出运算。在主函数中,先读入三个字符串表示的高精度数,然后将它们转换为 `BigInt` 类型。接下来,按照梯形面积的公式计算结果,并输出即可。由于三个高精度数相乘可能会产生很长的结果,因此在计算时需要注意控制精度,这里使用了除以 2 来代替除以 2.0,从而得到整除的结果。