圆周率可算9万位!

#include <time.h>
#include <iostream>
#include <list>
#include<math.h>
using namespace std;
//
 估测要计算的次数
 方法一:
//int count(int n) 
//{
//	int i = 1;
//	double sum = 0;
//	int a, b;
//	while(1)
//	{
//		a = 2 * i + 1;
//		b = i;
//		sum = sum + log10(a / b);
//		i++;
//		if (sum > n + 1) {
//			return i;
//		}
//	}
//}
//
 方法二:
int count(int n)
{
	double ret = (double)n;
	return (int)(ret / 0.3);
}

int main()
{
// 定义我们需要多少个结点
#define NODE_NUM 550
	list<int> num(NODE_NUM, 0);// 存放R(n)
	list<int> sum(NODE_NUM, 0);// 存放Sum(n)
	int print;// 所需精度
	cin >> print;
	int cnt = count(print);// 所需迭代次数
    
	// 我们直接将 R(1) 初始化为2,这样就可以免去后面再统一乘2
	num.front() = 2;
	sum.front() = 2;
	
	// 这里循环的 i 就是 n 
	for (int i = 1; i <= cnt; ++i)
	{			
		int ret = 0;// 记录进位,补位情况

	 // 计算R(n + 1)
	
		// 计算 R(n) * n
		for (list<int>::reverse_iterator cur1 = num.rbegin(); cur1 != num.rend(); cur1++)
		{
            // 每一位都是本位乘i,再加上进位
			int val = *cur1 * i + ret;
            // 保存进位
			ret = val / 10;
            // 保存本位
			*cur1 = val % 10;
		}

		ret = 0;
		// 计算 R(n) * n / (2n + 1)
		for (list<int>::iterator cur1 = num.begin(); cur1 != num.end(); cur1++)
		{
            // 除数
			int div = (i << 1) + 1;
            // 加上前一位的余数
			int val = *cur1 + ret * 10;
            // 除法,保存本位
			*cur1 = val / div;
            // 保存余数
			ret = val - *cur1 * div;
		}

		ret = 0;
		// 计算 sum += R(n + 1)
		for (auto cur2 = sum.rbegin(), cur1 = num.rbegin(); cur2 != sum.rend(); cur2++, cur1++)
		{
            // 大数加法
			int val = *cur1 + *cur2 + ret;
			*cur2 = val % 10;
			ret = val / 10;
		}
	
	}
	// 打印
	cout << sum.front() << '.';
	list<int>::iterator it = sum.begin();
	it++;

	int i = 0;
	while (i < print)
	{
		cout << *it;
		it++;
		i++;
	}
	
	return 0;
}

 电脑内存少的不要尝试!!!

后果自负

我很有自知之明就只测试一万位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值