题解 P1727 【计算π】
java来一发
初入坑java,打算用java水几道简单题,没想到唔水出个了炸弹,做题的过程中花式出错,但是也确实学到了
这题我估摸着我用c++都么得
利用下面两个公式
1.梅钦公式
2.
对初学java的我来说还是有一定的挑战的,不过也练了
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;
}
}
网上有个大佬利用的是类梅钦公式,收敛更快一点,如果卡时限可以改这个