【基础算法】圆周率的多种方法求算 & C++实现

简介: 一个圆如下面左图所示,其半径为1,其内部内接一个正六边形。设正六边形的边长为y1。由几何知识可得知y1=1,所以圆的周长可近似为正六边形的周长C=6×y1=6.所以圆周率为前面的近似圆周长与圆直径之比,即C/2= 3≈π,这就是按照割圆法来得到圆周率近似值的方法。

割圆法


       一个圆如下面左图所示,其半径为1,其内部内接一个正六边形。设正六边形的边长为y1。由几何知识可得知y1=1,所以圆的周长可近似为正六边形的周长C=6×y1=6.所以圆周率为前面的近似圆周长与圆直径之比,即C/2= 3≈π,这就是按照割圆法来得到圆周率近似值的方法。

44f2dc372a0653e98cf97c8a2a561910_beacb1eb43f84150b1ae6f902b4f1eaa.png


分析:(上面右图所示)


其中边长为m、y1、y2的三条边构成一个小直角三角形,根据勾股定理可得:

e8f47f7a8e8cebe093b7476575fb6caf_f7aeee6bd93a4fe1adc4dd9ad0a54f33.png

其中边长为n,y1,1的三条边构成一个较大的三角形,根据勾股定理可得:

e743cf7f5dabcde54406b677e9924140_77c6206857b4465f9e8689e946609187.png

结合条件图中已知条件(m+n=1)和几何关系对公式继续进行化简推导:

0d57ea096ade10876552273249d07be1_63bbc6d1bfa9440aaedd7e24f34d08df.png

所以圆周率π的近似值为:

91b58ba88e40563855ddce28ee00d7cf_5b0a7c5d763a4c769e4e5dd47defb9b7.png

如果内接24边形,其边长为y3,则其圆周率为:

dfe1a6a0bb8bd7c4ed9c5c055196b645_538746e2ee2d4dc7916eccd82c441982.png

如果内接48边形,其边长为y4,则其圆周率为:

d7b2b0d3fb451d05fe333f03859a3c63_dd851708b8fa4a33ba1dae8fb65e641c.png

……


综上归纳可知,在割圆术这个算法中主要用到以下两个公式:

7d2589ff462843fefe55a37064443739_ca21c3301e844760b4c680f04bf3325f.png

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
class cyclotomic {
public:
  void cyclotomic1()
  {
  int i = 1,a=1;
  double len = 1;
  while(i<=n)
  { 
    len = 2 - sqrt(4 - len);   //内接多边形的边长
    a *= 2;
    i++;
  }
  pi = 3.0 * (double)a * sqrt(len);
  }
  void showresult()
  {
  cout.precision(12);   //小数点后第十二位
  cout << pi << endl;
  }
  int n;
  double pi;
};
void text()
{
  cyclotomic c;
  cout << "输入要切割的次数:" << endl;
  cin>>c.n;
  c.cyclotomic1();
  c.showresult();
}
int main()
{
  text();
}

cb98cecf344f590c5a9463b8e99d1e20_be8e316b599a4f0ba5f4af0a2537c3af.png


●级数公式法


       在微积分中,对一个表达式进行级数展开并取极限便可以得到一系列的迭代计算公式。对于圆周率π也可以采用相同的方法来得到级数公式(泰勒展开式)。这样的级数公式很多,依赖于不同的级数展开表达式,下面就是一个典型的求圆周率级数公式的例子:

719cec5ac1c321ae59b447f55b05ea02_e95f95de906d405e9477f358aa92dca0.png

c12d0e7692a9ed5cb291a3adadfd1907_b26273be30354e5b85a71c9add462eb0.png

#include<iostream>
#include<iomanip>
using namespace std;
class series1 {
public:
  void series_1()
  {
  int i = 1;
  double sum=1,record=1, m=1, n=3,t;
  while (i <= x)
  {
    t = m / n;
    t = t * record;
    sum += t;
    m += 1;
    n += 2;
    record = t;
    i++;
  }
  pi = 2.0 * sum;
  }
  void showresult()
  {
  cout.precision(12);//小数点后第十二位
  cout << pi << endl;
  }
  int x;
  double pi;
};
void text()
{
  series1 s1;
  cout << "请输入该公式往后计算的位数:" << endl;
  cin >> s1.x;
  s1.series_1();
  s1.showresult();
}
int main()
{
  text();
}

13aed22994c3f3a3d443dae9815bce5a_187b1a10f6204b14b8894ad2e2066967.png

●格雷戈里公式法


       格雷戈里公式的实质是反正切函数的泰勒展开式,属于级数公式的一种,具体公式如下:

db2af17fc1173062995ff1e8c70be997_6a93e135c7e642ce8de179a6339749de.png


0c73c17261a740f56c2e14793f302263_2d74b3ac110d429d9bfb71d5891287b6.png

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
class Gregory {
public:
  void Gregory1()
  {
  int sign = 1;
  double m = 1, term = 1;
  while (fabs(term) >= x)
  {
    pi += term;
    m += 2;
    sign = -sign; 
    term = sign / m;
  }
  pi = 4.0 * pi;
  }
  void showresult()
  {
  cout.precision(12);//小数点后第十二位
  cout << pi << endl;
  }
  double x;
  double pi=0;
};
void text()
{
  Gregory g;
  cout << "输入精度e的值:" <<endl;
  cin >> g.x;
  g.Gregory1();
  g.showresult();
}
int main()
{
  text();
}

816e0706e90bc0b802069e7387f7c2fb_8c61c961071c41e891dc588fd5551578.png

●蒙特卡洛


       在概率算法的文章中,举的蒙特卡洛算法例子就是用概率的方法去寻找π,具体在http://t.csdn.cn/VifFM


目录
相关文章
|
15天前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
5天前
|
机器学习/深度学习 算法 数据挖掘
算法金 | K-均值、层次、DBSCAN聚类方法解析
**摘要:** 这篇文章介绍了聚类分析的基本概念和几种主要的聚类算法。聚类是无监督学习中用于发现数据内在结构的技术,常用于市场分析、图像分割等场景。K-均值是一种基于划分的算法,简单高效但易受初始值影响;层次聚类包括凝聚和分裂方式,形成层次结构但计算复杂;DBSCAN基于密度,能处理任意形状的簇,但参数选择敏感。文章还讨论了这些算法的优缺点和适用场景,并提供了相关资源链接和Python实现。
28 9
算法金 | K-均值、层次、DBSCAN聚类方法解析
|
2天前
|
数据采集 机器学习/深度学习 算法
机器学习方法之决策树算法
决策树算法是一种常用的机器学习方法,可以应用于分类和回归任务。通过递归地将数据集划分为更小的子集,从而形成一棵树状的结构模型。每个内部节点代表一个特征的判断,每个分支代表这个特征的某个取值或范围,每个叶节点则表示预测结果。
11 1
|
3天前
|
算法 数据中心 C++
基于C++雪花算法工具类Snowflake -来自chatGPT
基于C++雪花算法工具类Snowflake -来自chatGPT
8 1
|
8天前
|
算法 数据处理 C++
C++一分钟之-迭代器与算法
【6月更文挑战第21天】C++ STL的迭代器统一了容器元素访问,分为多种类型,如输入、输出、前向、双向和随机访问。迭代器使用时需留意失效和类型匹配。STL算法如查找、排序、复制要求特定类型的迭代器,注意容器兼容性和返回值处理。适配器和算法组合增强灵活性,但过度使用可能降低代码可读性。掌握迭代器和算法能提升编程效率和代码质量。
23 3
|
12天前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
38 10
|
9天前
|
机器学习/深度学习 人工智能 算法
【机器学习】RLHF:在线方法与离线算法在大模型语言模型校准中的博弈
【机器学习】RLHF:在线方法与离线算法在大模型语言模型校准中的博弈
219 6
|
14天前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
30 7
|
29天前
|
缓存 负载均衡 算法
C++如何实现一致性算法
一致性哈希是一种用于分布式系统的负载均衡算法,旨在减少服务器增减导致的数据迁移。当有N台服务器时,通过哈希环将请求均匀分布到每台服务器,每台处理N/1的请求。若使用缓存如Redis,可进一步处理高并发场景。算法将哈希值空间视为环形,服务器和请求哈希后定位到环上,按顺时针方向找到第一台服务器作为负载目标。提供的C++代码实现了MD5哈希函数,以及一致性哈希算法的物理节点、虚拟节点和算法本身,以实现节点的添加、删除和请求映射。
23 1
C++如何实现一致性算法
|
14天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题