c语言圆周率的计算BBP算法,BBP算法计算圆周率(BBP Formula HDU - 6217)

[圆周率pi的BBP计算公式之详细证明]

概述

BBP算法求圆周率π,它的优点在于可以直接求出圆周率的某一位d开始的一串数字,而不依赖于第d位之前的数字,传统的算法需要一位位地求。BBP算法节省了一大部分时间和内存,但BBP所求的圆周率是用16进制表示的。

核心公式:

6c1555302777729326ca3efa0910d9ec.png

第一步:将上式分解成四段求解,可以写成通项公式:

6c1555302777729326ca3efa0910d9ec.png

整理一下:

6c1555302777729326ca3efa0910d9ec.png

两边乘上

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png

第一个求和部分(n-k)>0,所以将分子取分母的模,目的是为了让分子分母相除后得到小数部分,

第二个求和部分(n-k)<0,无需再次取模:

6c1555302777729326ca3efa0910d9ec.png

小数部分(如果ans<0,则ans再加上1,使他变为正数):

6c1555302777729326ca3efa0910d9ec.png

最后ans*16转化为16进制,取整数部分。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define clr(str,x) memset(str,x,sizeof(str))

#define FRER() freopen("in.txt","r",stdin);

#define FREW() freopen("out.txt","w",stdout);

#define MAX_INF 0x7fffffff

#define INF 0x3f3f3f3f

#define maxn

typedef long long int ll;

using namespace std;

ll q_pow(ll a,ll b,ll mod)

{

ll res=1;

while(b)

{

if(b&1)

res=res*a%mod;

a=a*a%mod;

b/=2;

}

return res;

}

double bbp(int n,ll k,ll b)

{

double res=0;

for(int i=0;i<=n;i++)

res+=(q_pow(16,n-i,8*i+b)*1.0/(8*i+b));

for(int i=n+1;i<=n+1000+1;i++)

res+=pow(16,n-i)*1.0/(8*i+b);

return k*res;

}

int main()

{

//FRER()

//FREW()

int T,Case=1,n;

cin>>T;

while(T--)

{

double ans=0;

cin>>n;

ans=bbp(n-1,4,1) - bbp(n-1,2,4) - bbp(n-1,1,5) - bbp(n-1,1,6);

ans = ans - (int)ans;

if(ans < 0)

ans+=1.0;

ans*=16.0;

int x=(int)ans;

char c;

if(x>=0&&x<=9) c=x+'0';

else c=x-10+'A';

printf("Case #%d: %d %c\n", Case++, n, c);

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以给你介绍一种称为「莫比乌斯反演」的方法来计算圆周率。这种方法的优点是可以通过计算莫比乌斯函数的值来计算圆周率,而莫比乌斯函数的计算是非常快速的。 首先,我们需要定义一个函数来计算莫比乌斯函数: ``` int moebius(int n) { if (n == 1) return 1; int res = 1, count = 0; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { res *= -1; n /= i; if (n % i == 0) return 0; } } if (n > 1) res *= -1; return res; } ``` 然后,我们可以使用如下的代码来计算圆周率: ``` double pi = 0; for (int i = 1; i <= n; i++) { pi += moebius(i) / (double) i; } pi = sqrt(6 * pi); ``` 这里的 `n` 表示你希望计算圆周率的精度。计算的精度越高,计算的时间就会越长。 希望这些内容能对你有所帮助。 ### 回答2: 圆周率(π)的计算算法有许多种,下面是一个简单的C语言算法: ```c #include <stdio.h> double calculatePi(int iterations) { double pi = 0.0; for (int i = 0; i < iterations; i++) { double term = 1.0 / (2 * i + 1); if (i % 2 == 0) { pi += term; } else { pi -= term; } } return pi * 4; } int main() { int iterations; printf("请输入迭代次数:"); scanf("%d", &iterations); double pi = calculatePi(iterations); printf("圆周率的近似值为:%f\n", pi); return 0; } ``` 这个算法使用了莱布尼茨级数来计算圆周率。它通过循环迭代来逐步计算圆周率的近似值。迭代次数越多,计算得到的近似值越精确。在算法中,利用了莱布尼茨级数的性质,根据每个项的正负号来进行累加或累减操作,最后乘以4得到圆周率的近似值。 用户需要输入迭代次数,更大的迭代次数会得到更精确的结果。运行程序后,它将输出计算得到的圆周率的近似值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值