题解 P1727 【计算π】

· · 题解

java来一发

初入坑java,打算用java水几道简单题,没想到唔水出个了炸弹,做题的过程中花式出错,但是也确实学到了\cdots\cdots

这题我估摸着我用c++都么得

利用下面两个公式

1.梅钦公式

π=16arctan(1/5)-4arctan(1/239)

2.arctan(x)无穷级数展开

arctan(x)=x-x^3/3!+x^5/5!-x^7/7!+\cdots

对初学java的我来说还是有一定的挑战的,不过也练了BigDecimal,总之快乐就完事啦!

import java.math.BigDecimal;
import java.util.Scanner;
import java.math.RoundingMode;
public class LuoGuP1727_3 {
    public static int n;
    public static void main(String[] args){
        Scanner cin=new Scanner(System.in);
        n=cin.nextInt();
        if(n==0){
            System.out.println("3");
            return;
        }
        BigDecimal part1=arccot(5).multiply(new BigDecimal("16"));
        BigDecimal part2=arccot(239).multiply(new BigDecimal("4").negate());
        BigDecimal ans=part1.add(part2);
        String s=ans.toString();
        System.out.println("3.");
        int cnt=0;
        for(int i=2;;i++){
            System.out.print(s.charAt(i));
            ++cnt;
            if(cnt==n) break;
            if(cnt%50==0) System.out.println("");
            else if(cnt%10==0) System.out.print(" ");
        }
    }
    public static BigDecimal arccot(int x){
        BigDecimal now=BigDecimal.ONE.divide(BigDecimal.valueOf(x),n+10,RoundingMode.HALF_UP);
        BigDecimal x2=BigDecimal.valueOf(x).multiply(BigDecimal.valueOf(x));
        BigDecimal ans=BigDecimal.ZERO;
        BigDecimal tmp;
        boolean flag=true;
        for(int i=1;;i+=2){
            tmp=now.divide(new BigDecimal(i),n+10,RoundingMode.HALF_UP);
            if(tmp.compareTo(BigDecimal.ZERO)==0) break;
            if(flag==true)
                ans=ans.add(tmp);
            else
                ans=ans.subtract(tmp);
            flag=!flag;
            now=now.divide(x2,n+10,RoundingMode.HALF_UP);
        }
        return ans;
    }
}

网上有个大佬利用的是类梅钦公式,收敛更快一点,如果卡时限可以改这个

π=176arctan(1/57)+28arctan(1/239)-48arctan(1/682)+96arctan(1/1294)