カメヲラボ

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

Rope(1)

  • hypotを使おうZE!

2点間A(x1,y1), B(x2,y2)の距離といえば、一般的には

sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) )

だが、ショートコーダーはこのような長い記述をしてはならない。
math.hを注意深く見てみると、役立ちそうな関数がいくつかある。

以前2819番(http://www.4dm.org/PKU/2819.htm)で使用した、
log(1+x)でxが小さい値の場合に高精度で計算してくれるlog1p

次回の記事で使う予定だが、3乗根を求めるcbrt

そして、sqrt(x*x+y*y)を計算してくれるhypot
これらをすべて使いこなせば、ショートコーダーとしてのレベルも
グンと上がるだろう。

前回のコードを、hypotを使用して書き直してみると、

double s,a,b,c,d,x,y,r;i;
main(n){
  scanf("%d%lf",&n,&r);
    for(;~scanf("%lf%lf",&a,&b);){
      i++?s+=hypot(c-a,d-b):(x=a,y=b);
      c=a;d=b;
    }
  printf("%.2f",s+6.282*r+hypot(x-a,y-b));
}

このようになり、大幅に短縮できる。