数据结构noj高精度计算pi值
时间: 2023-10-21 15:13:09 浏览: 107
西北工业大学数据结构noj_1-6题
以下是使用高精度计算方法计算pi值的代码示例:
```c++
#include <iostream>
#include <vector>
using namespace std;
const int BASE = 10000; // 每个数字占4位
const int D = 10000; // 小数点后D位
struct BigNum {
vector<int> digits; // 存储每个数字,从低位到高位
BigNum() {}
BigNum(int x) {
while (x) {
digits.push_back(x % BASE);
x /= BASE;
}
}
BigNum operator+(const BigNum& b) const {
BigNum res;
int carry = 0;
for (int i = 0; i < digits.size() || i < b.digits.size() || carry; i++) {
if (i < digits.size()) carry += digits[i];
if (i < b.digits.size()) carry += b.digits[i];
res.digits.push_back(carry % BASE);
carry /= BASE;
}
return res;
}
BigNum operator*(int x) const {
BigNum res;
int carry = 0;
for (int i = 0; i < digits.size() || carry; i++) {
if (i < digits.size()) carry += digits[i] * x;
res.digits.push_back(carry % BASE);
carry /= BASE;
}
return res;
}
BigNum operator/(int x) const {
BigNum res;
int r = 0;
for (int i = digits.size() - 1; i >= 0; i--) {
r = r * BASE + digits[i];
res.digits.push_back(r / x);
r %= x;
}
reverse(res.digits.begin(), res.digits.end());
while (res.digits.size() > 1 && res.digits.back() == 0) res.digits.pop_back();
return res;
}
friend ostream& operator<<(ostream& out, const BigNum& b) {
out << b.digits.back();
for (int i = b.digits.size() - 2; i >= 0; i--) {
out.width(4); // 每个数字占4位
out.fill('0');
out << b.digits[i];
}
return out;
}
};
int main() {
int n = (D + 3) / 4; // 需要计算的整数部分位数
BigNum a = 1, b = 1, t = 1, res = 0;
for (int i = 0; i < n; i++) {
res = res + t * a / b;
a = a * (2 * i + 1);
b = b * (i + 1);
t = t * (-1);
}
res = res * 4;
cout << res << ".";
a = a * 10;
for (int i = 0; i < D; i++) {
res = a / b;
cout.width(4);
cout.fill('0');
cout << res;
a = a % b * 10;
}
return 0;
}
```
该程序使用 BigNum 结构体存储大数,并重载了加、乘、除、输出运算符。主要思路是根据莱布尼茨级数公式计算π值的近似值,然后输出小数点后D位的数值部分。
阅读全文