A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

计算圆周率

PI=4-4/3+4/5-4/7…….

要求:打印出第一个大于 3.1415小于 3.1416的值,程序如下,为什么我运行好几次也运行不出来,求高手看看那个地方错了?多谢,急着等答案!



class Pi {

public static void main(String[] args)

double pi =0;  //定义初始值

double fenZi = 4;    //分子为4

double fenMu = 1;  //第一个4,可看作分母为1 的分式,以后的分母每次递增2

for (int i = 0; i < 1000000000; i++){ //运行老久,减少循环次数会快很多,只是精确度小些

pi += (fenZi/fenMu) ;

fenZi *= -1.0;   
fenMu += 2.0;    //分母的变化是1,3,5,7, ….   每项递加2

}

System.out.println(pi);

}

}

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

4 个回复

正序浏览
  1. public static void main(String[] args) throws Exception {
  2.                 double PI = 0;
  3.                 double i = 1;
  4.                 while (true) {
  5.                         PI += Math.pow(-1, i + 1) * 4 / (i * 2 - 1);
  6.                         if (PI > 3.1415 && PI < 3.1416) {
  7.                                 break;
  8.                         }
  9.                         i++;
  10.                 }
  11.                 System.out.println(PI);
  12.         }
复制代码
回复 使用道具 举报
我用的和楼主的公式差不多:
莱布尼茨公式
π/4=1-1/3+1/5-1/7+1/9-1/11+……
用for循环要10万次才能算出第一个符合要求的数.
最后结果:3.141599999994786
代码如下:
  1. /*
  2. 莱布尼茨公式
  3. π/4=1-1/3+1/5-1/7+1/9-1/11+……

  4. */
  5. class Pi

  6. {
  7.         public static void main(String[] args)
  8.         {

  9.                 double x = 3;
  10.                 double temp = 1;
  11.                 double pi = 0;
  12.                 int w = 0;
  13. /**************************方法一:for循环***********************************************/
  14.                         for (int z = 0;z<100000;z++ )
  15.                         {
  16.                                 temp =temp - (1/x)+(1/(x+2));//pi/4=1-1/3+1/5......
  17.                                 pi = temp * 4;
  18.                                 if (pi>3.1415 && pi<3.1416)//判断pi是不是大于3.1415小于3.1416
  19.                                 {
  20.                                         System.out.println(pi);
  21.                                         break;//获取数字后结束循环.
  22.                                 }

  23.                                 x+=4;//
  24.                         }
  25. /*************************方法二:while循环**********************************************/
  26.                 while (w<100000)
  27.                 {
  28.                         temp = temp - (1/x)+(1/(x+2));
  29.                         pi = temp * 4;
  30.                         if (pi>3.1415 && pi<3.1416)//判断pi是不是大于3.1415小于3.1416
  31.                         {
  32.                                 System.out.println(pi);
  33.                                 break;//获取数字后结束循环.
  34.                         }

  35.                         x+=4;
  36.                         w++;
  37.                 }

  38.         }
  39. }
复制代码
两种方法单独用结果一样   但是同时用就有点差别.

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
撒时候搞个表情滴,上面改下:
public static double rand(int n) {
  return n<=1 ? 1   :   (double) Math.pow(-1,n+1)*4/rand(2*n-1);
}
回复 使用道具 举报
用递归算法实现方便,我写个方法

public static double rand(int n) {
  return n<=1 ? 1:(double) Math.pow(-1,n+1)*4/rand(2*n-1);
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马