カメヲラボ

主にプログラミングとお勉強全般について書いてます

Javaって素敵やん?

私は数値計算に関しての理解が浅いので、困ったときはとりあえずJava頼みだ。(1.0-1.0/n)^(n-2)をマクローリン展開で計算することで、なんとかAcceptされた。
なんともショボいコードだが、とりあえず晒しとこう。


import java.util.*;
import java.math.*;
import java.text.*;

class Main {
public static void main(String s[]){

Scanner c=new Scanner(System.in);

double n;
while( c.hasNext() && (n=c.nextDouble())!=0.0 )
{
DecimalFormat df = new DecimalFormat("0.00000000000000");

double j=1.0, xx=-1.0/n;
BigDecimal d=new BigDecimal(1.0);
BigDecimal a=new BigDecimal(n-2.0);
BigDecimal x=new BigDecimal(xx);

n=n-2.0;

for(int i=2;i<22;++i){
d=d.add(a.multiply(x).divide(new BigDecimal(j),30,BigDecimal.ROUND_HALF_EVEN));
j*=i;
x=x.multiply(new BigDecimal(xx));
n=n-1.0;
a=a.multiply(new BigDecimal(n));
a=a.setScale(30,BigDecimal.ROUND_HALF_EVEN);
}
System.out.println(df.format(d.doubleValue()-5e-15));
}
}
}

それにしてもややこしすぎる。全体的に結構短いコードが通っているので、もっと簡単な方法があるのだと思うが、見当もつかない。う〜んむ。