i信息学奥赛

加入QQ群:1025629106,或关注微信公众号:i信息学奥赛,获取更多学习资源。

导航

圆周率

Posted on 2021-05-18 20:31  shnoip  阅读(287)  评论(0编辑  收藏  举报

模拟:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int cnt,jd;
 5 int main () {
 6   jd=10000;
 7   for (int x=1;x<=jd;x++)
 8     for (int y=1;y<=jd;y++)
 9       if (sqrt(x*x+y*y)<=jd) cnt++;
10   cout<<((cnt-jd)*4+1)*1.0/jd/jd;
11   return 0;
12 }
View Code

随着 jd 不断加大,输出不断逼近 3.14159

 

华二 沈思贤提供

利用反余弦函数

1 include <bits/stdc++.h>
2 using namespace std;
3 int main() {
4   cout<<fixed<<setprecision(50)<<acos(-1);
5   return 0;
6 }
View Code

反余弦函数精度限制最多48位

 

利用莱布尼茨无穷级数

π/4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - …

 1 #include<cstdio>
 2 using namespace std;
 3 double pi;
 4 long long fm=1;  //分母每次加 2,这里要定义为 long long 
 5 int fh=1;
 6 int main() {
 7   //freopen("pi.txt","w",stdout);
 8   for (long long i=1;i<=2147483647;i++) {  //奇怪的是i若定义为int类型,循环出不来 
 9       pi+=1.0/fm*fh;
10       fm+=2;
11       fh*=-1;
12       //printf("%d %.20f\n",i,pi*4);
13   }
14   printf("%.20f\n",pi*4);  //9.5秒出结果 
15   return 0;
16 }
View Code

 

尼拉坎特哈级数
PS:大约60000多项之后精度开始有偏差

 1 #include <iostream>
 2 #include <iomanip>
 3  using namespace std;
 4  double pi=3;
 5  long long a=2,b=3,c=4;
 6  int fh=1;
 7  int main() {
 8    for (int i=1;;i++) {
 9      pi=pi+fh*4.0/(a*b*c);
10      fh=fh*-1;
11      a=a+2;b=b+2;c=c+2;
12      cout<<i<<' '<<fixed<<setprecision(20)<<pi<<endl;
13   }
14   return 0;
15 }
View Code