1329根据公式求Π值

圆周率
Time Limit:1000MS Memory Limit:32768K
Description:
祖冲之用了毕生精力算圆周率,也只算到小数点后第6位。现在有了电脑的帮忙,相信
我们就可以立刻就算出结果了吧,呵呵。

计算圆周率的方法很多,我们用其中的一个公式:

π/4=1-1/3+1/5-1/7+…+(-1)^(n+1)/(2*n+1) n=0,1,2,…

当n的取值越来越大时,π的精确度也就越高。

现在给定n,计算相应的π值。

Input:
输入数据中包含一些整数(0<n<400000),当n=0时,表示输入结束。
Output:
每个整数对应一个计算结果,保留小数精度8位,每个结果独占一行。
Sample Input:
10
50
1000
0
Sample Output:
3.23231581
3.16119861
3.14259165
超时案例:
1)按照公式写:递归/循环都超时
2)找规律分母等差数列首相为一,公差为二


#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
using namespace std;
/*double ans(double n)
{
	double sum = 0,p=1;
	for(double m=0;m<=n;m++)
	{
		int i;
		if ((int)m % 2 == 0)i = 1;//偶数项为正
		else i = -1;
		sum += (1 /p) * i;
		p += 2;
	}
	return sum;
}*/
int main()
{
	double n;
	while(cin>>n,n!=0)
	{
		double sum = 0, p = 1;
		for (double m = 0; m <= n; m++)
		{
			int i;
			if ((int)m % 2 == 0)i = 1;//偶数项为正
			else i = -1;
			sum += (1 / p) * i;
			p += 2;
		}
		cout<<setiosflags(ios::fixed)<<setprecision(8) << sum*4<< endl;
	}
}
//0 1 100 101 110 111
以下是一个基于忙等待的Pthreads程序,可以计算出Pi的: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #define INTERVALS 1000000000 double pi = 0.0; void *calculate_pi(void *args){ int tid = *(int *)args; double sum = 0.0; double sign = (tid % 2 == 0) ? 1.0 : -1.0; int start = tid * (INTERVALS / 4); int end = start + (INTERVALS / 4); for(int i = start; i < end; i++){ double x = (double)i / (double)INTERVALS; sum += sign / (2.0 * x + 1.0); sign = -sign; } while(pi == 0.0){ // busy wait until pi is not 0.0 } pi += sum; return NULL; } int main(){ pthread_t threads[4]; int tids[4]; for(int i = 0; i < 4; i++){ tids[i] = i; pthread_create(&threads[i], NULL, calculate_pi, &tids[i]); } for(int i = 0; i < 4; i++){ pthread_join(threads[i], NULL); } printf("Pi = %lf\n", pi * 4.0); return 0; } ``` 程序的主要思路是将计算Pi的任务分为4个线程,每个线程计算一个四分之一的部分。线程使用忙等待等待其他线程完成计算,并将结果累加到全局变量pi中。主线程等待所有线程完成后,输出最终的Pi。 在calculate_pi函数中,每个线程计算自己负责的部分,并将结果累加到pi变量中。由于所有线程都需要等待其他线程完成计算,因此在pi变量初始化为0.0时,线程会一直忙等待,直到pi变量被其他线程修改为非0。 在主函数中,创建四个线程,并等待它们完成计算。最后输出计算出来的Pi,这个需要乘以4才是真正的Pi。 需要注意的是,这个程序中使用的忙等待方法并不是最优的方法,因为它会浪费CPU资源。更好的方法是使用条件变量来实现线程间的同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值