计算π的近似值,π的计算公式为:

π=2*(2^2)/(1*3)*.....*(2n)^2/(2n-1)(2n+1)要求:精度为10-5,并输出n的大小下面是我自己写的,运行测试卡在3.14121就不变化... π=2*(2^2)/(1*3)*.....*(2n)^2/(2n-1)(2n+1)
要求:精度为10-5,并输出n的大小
下面是我自己写的,运行测试卡在3.14121就不变化了,不知道啥毛病。求解。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n=1;
float pi=2,a,b;
while(fabs(pi-3.141592)>0.000001)
{
a=4*n*n;//该方法按照公式计算,n就是公式里的n
b=4*n*n-1;
pi=pi*a/b;
n++;
}
cout<<"pi="<<pi<<endl;
cout<<"此时n="<<n<<endl;
return 0;
}

另外一种做法:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n=1,i=1;//n用来累计执行了多少次
float pi=2,a,b;
while(fabs(pi-3.141592)>0.000001)
{
a=(i+1)^2;
b=i*(i+2);
pi=pi*a/b;
i+=2;
n++;
}
cout<<"pi="<<pi<<endl;
cout<<"此时n="<<n<<endl;
return 0;
}
展开
 我来答
博学小赵爱生活
高能答主

2019-10-30 · 专注于食品生活科技行业
博学小赵爱生活
采纳数:460 获赞数:111927

向TA提问 私信TA
展开全部

#include<stdio.h> 

main() 

{ int n,i; double t,

sum;/*1*/ 

printf("请输入n的值\n"); 

scanf("%d",&n); 

sum=2; i=1; t=2;/*2*/ 

while(i<n) { t=t*(2*i)*(2*i)/(2*i-1)/(2*i+1);

/*3*/ // sum=sum*t; i=i+1; } 

printf("π的值=%f\n",t);/*4*/ }

或。

写一个Java程序来实现蒙特卡洛法求π的近似值:

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class MonteCarloPi {

public static void main(String[] args) throws Exception{

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.print("How many darts shoud I toss at the board?\n");

String s = br.readLine();

int numberOfDarts = Integer.parseInt(s.trim());

double radius = 1.0;

Dartboard d = new Dartboard(radius);

for(int i=1; i<=numberOfDarts; i++){

Toss t = Toss.getRandom(radius);

d.strike(t);

}

double fractionIn = d.getFractionIn();

double pi = 4.0 * fractionIn;

System.out.println("Pi is approximately "+pi);

}

}

 class Dartboard{

private double radius;

private int insideCircle, outsideCircle;

public Dartboard(double radius){

this.radius = radius;

insideCircle = 0;

outsideCircle = 0;

}

public void strike(Toss toss){

double x = toss.getX();

double y = toss.getY();

if(Math.sqrt(x*x + y*y) < radius)

insideCircle++;

else

outsideCircle++;

}

public double getFractionIn() {

double total = (double) (insideCircle + outsideCircle);

return (double) insideCircle/total;

}

}

class Toss{

private double x,y;

public Toss(double x, double y){

this.x = x;

this.y = y;

}

public double getX(){return x;}

public double getY(){return y;}

public static Toss getRandom(double radius){

double x,y;

double size = Math.random();

double sign = Math.random();

size = size * radius;

if(sign > 0.5)

x = size;

else

x = -size;

size = Math.random();

sign = Math.random();

size = size * radius;

if(sign > 0.5)

y = size;

else

y = -size;

return new Toss(x,y);

}

}

扩展资料:

C语言:用循环结构分别编写程序

#include

void main()

{

\x09int n=1;

\x09float temp;

\x09float sum=0;

\x09do

\x09{

\x09\x09temp=(float)1/(2*n-1);

\x09\x09if(n%2==1)

\x09\x09\x09sum+=temp;

\x09\x09else

\x09\x09\x09sum-=temp;

\x09\x09n++;

\x09}while(temp>=0.000001);

\x09printf("Pi=%f\n",sum*4);

}

嘟心哈他7445
2011-04-05 · TA获得超过1909个赞
知道小有建树答主
回答量:335
采纳率:100%
帮助的人:513万
展开全部
有错误的地方:
(1) int n,i,t;,t不能为整型,否则怎么计算小数?应该改为float t;
(2) t=t*(2*i)*(2*i)/(2*i-1)*(2*i+1);对照公式,应该改为t=(2*i)*(2*i)/((2*i-1)*(2*i+1));
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
LoveGrayD
2012-10-10 · TA获得超过4114个赞
知道小有建树答主
回答量:586
采纳率:100%
帮助的人:753万
展开全部
我看了一遍,1) 的程序上没有问题
我猜测 float 是精确到小数点后7位,同时在编译器中转化的时候会有精度损失
因为现在的编译器都是将float型转化成为double型的来进行计算的pi=pi*a/b;
这一步的精度损失不可预计。建议把float pi=2,a,b; 改为double试一下。
程序写的很漂亮呀 ^-&^
追问
额。。我刚试运行了一下,不行。根据课本上给出的源程序也无法得到3.141592...
另外,谢谢夸奖哈。就是不正确。
追答
#include
main()
{
int n,i;
double sum;
printf("请输入n的值\n");
scanf("%d",&n);
sum=2;
i=1;
while(i<n)
{
sum=sum*(2*i)*(2*i)/(2*i-1)/(2*i+1);
i=i+1;
}
printf("π的值=%lf\n",sum); //或者%f
}
我在搜搜上看来的,测试一些n的值,看看这样跑出来怎么样
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Ynzsvt
2011-04-06 · TA获得超过6669个赞
知道大有可为答主
回答量:1.5万
采纳率:40%
帮助的人:2869万
展开全部
#include<stdio.h>
main()
{
int n,i;
double t,sum;/*1*/
printf("请输入n的值\n");
scanf("%d",&n);
sum=2;
i=1;
t=2;/*2*/
while(i<n)
{
t=t*(2*i)*(2*i)/(2*i-1)/(2*i+1);/*3*/
// sum=sum*t;
i=i+1;
}
printf("π的值=%f\n",t);/*4*/

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
水岸落日
2012-10-12 · TA获得超过3660个赞
知道大有可为答主
回答量:5614
采纳率:6%
帮助的人:769万
展开全部
明确;
全球N;
全局y;
Y = 0;
N = 1;
而1 /(2n-1个)> = 0.001
Y = Y 1 /(2n-1个);
结束
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式