计算π的近似值

本文介绍了一种使用C语言编程计算π值的方法,通过级数公式进行迭代计算直至达到精度要求。代码简洁易懂,适合初学者学习。
题目描述

利用高利公式 π/4 ≈ 1 - (1/3) + (1/5) - (1/7) + ... ,编写程序计算π的近似值,直到最后一项的绝对值小于0.000001。 

输入


输出

在一行中按照格式 ”PI = xxxxx“ 输出所求的值。


AC代码如下:


#include "stdio.h"


int main(int argc, char* argv[])
{
	double n=0;
	double a=1;
	int i=0,isign=1;
	while(1)
	{
		n+=(isign*1.0/a);
		if (1.0/a<0.000001)//注意该判断语句在循环中的位置
		{
			break;
		}
		a+=2;
		isign=-1*isign;
	}
	printf("PI = %lf\n",4*n);
	return 0;
}


### 使用双向链表计算 π 的近似值 π 是一个无理数,其精确值无法通过有限次运算得出。然而,可以通过数值方法来逼近它的值。一种常见的方法是利用级数展开式(如莱布尼茨级数),并通过数据结构存储中间结果以提高效率。 以下是基于双向链表实现 π 近似值的一种方式: #### 双向链表定义 为了便于操作,先定义一个简单的双向链表节点类 `Node` 和链表管理器类 `DoublyLinkedList`[^4]。 ```python class Node: def __init__(self, value=0): self.value = value self.prev = None self.next = None class DoublyLinkedList: def __init__(self): self.head = None self.tail = None def append(self, value): new_node = Node(value) if not self.head: self.head = self.tail = new_node else: self.tail.next = new_node new_node.prev = self.tail self.tail = new_node def get_values(self): values = [] current = self.head while current: values.append(current.value) current = current.next return values ``` #### 莱布尼茨级数与双向链表结合 莱布尼茨级数用于估算 π 值的公式如下: \[ \pi \approx 4 \times (1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ...) \] 可以将每一项存入双向链表中,并逐步累加求和。具体过程如下: 1. 初始化双向链表为空。 2. 将级数中的每一项依次加入到链表中。 3. 遍历链表并累积求和。 下面是完整的 Python 实现代码: ```python def calculate_pi_with_doubly_linked_list(n_terms): dll = DoublyLinkedList() sign = 1 for i in range(1, n_terms * 2, 2): term_value = sign / i dll.append(term_value) sign *= -1 # 切换正负号 terms = dll.get_values() pi_approximation = 4 * sum(terms) return pi_approximation # 测试函数 n = 1000000 # 计算前一百万项 result = calculate_pi_with_doubly_linked_list(n) print(f"Approximated Pi with {n} terms: {result}") ``` 上述代码实现了以下功能: - 定义了一个双向链表,用来保存莱布尼茨级数的各项。 - 对于指定数量的项 \( n\_terms \),逐一代入公式并将结果存入链表。 - 最终遍历链表并对所有项求和,乘以 4 得到 π 的近似值。 这种方法虽然简单易懂,但由于涉及大量内存分配和指针操作,在大规模计算时可能不如数组或其他连续存储结构高效[^5]。 --- #### 性能优化建议 如果希望进一步提升性能,可以考虑减少动态内存分配次数或者改用更高效的算法(如蒙特卡罗模拟)。不过需要注意的是,这些改进可能会牺牲部分清晰性和可读性。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值