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)); }
このようになり、大幅に短縮できる。