题目描述
•人们创造了上百种方法求圆周率π的值。其中比较常用且易于编程的是无穷级数法。
•π/4 = 1 – 1/3 + 1/5 – 1/7 + 1/9 - …
•是初学者特别喜欢的一个级数形式,但其缺点是收敛太慢。
•π/2 = 1 + 1/3 +1/3*2/5 + 1/3 *2/5 *3/7 + 1/3 *2/5 * 3/7 *4/9 + …
•是收敛很快的一个级数方法。
•请你利用这个方法,写出精确到小数点后100位精度的圆周率。
•注意:尾数的四舍五入! 尾数是0也要保留!
•显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。
**import java.math.BigDecimal;
public class Main {
public static void main(String[] args)
{
// 第一种级数方式,太慢了,算不出来,不精确
//double PI = 0;
BigDecimal PI =BigDecimal.ZERO;
BigDecimal j=BigDecimal.ONE;//变量j
BigDecimal k=BigDecimal.ONE;//常量k
BigDecimal m=BigDecimal.valueOf(2);//大整数2
BigDecimal n=BigDecimal.valueOf(-1);//大整数-1
//PI+=1.0/(2*i-1)*a;// 1 -1 1 -1
BigDecimal a=BigDecimal.ONE;//变量a 1 -1 1 -1
for(int i=1;i<900000;i++)
{
PI=PI.add(k.divide(m.multiply(j).subtract(k),105,BigDecimal.ROUND_HALF_UP).multiply(a));//pi+=1/(2*j-1)*a
j=j.add(BigDecimal.ONE);//j++;
a=a.multiply(BigDecimal.valueOf(-1));
//PI=BigDecimal.ONE.divide((2*i-1)*Math.pow(-1,i+1 ));
}
PI=PI.multiply(BigDecimal.valueOf(2));
System.out.print(PI.setScale(100,BigDecimal.ROUND_HALF_UP));
//第二种级数方式1000和2000交叉取数即可
BigDecimal PI0 =BigDecimal.ONE;//临时pi
BigDecimal PI1 =BigDecimal.ONE;//真正的pi
BigDecimal i=BigDecimal.ONE;//变量i
BigDecimal j=BigDecimal.ONE;//变量j
BigDecimal m=BigDecimal.valueOf(2);//大整数2
BigDecimal n=BigDecimal.valueOf(1);//大整数1
for(int s=0;s<200;s++)
{
PI0=PI0.multiply(i.divide(m.multiply(i).add(n),1005,BigDecimal.ROUND_HALF_UP));//PI0*=1/(2*i+1);
PI1=PI1.add(PI0);
i=i.add(BigDecimal.ONE);//i++;
}
PI1=PI1.multiply(BigDecimal.valueOf(2));
System.out.print(PI1.setScale(1000,BigDecimal.ROUND_HALF_UP));
}
}**