問題
自分の考察
まず,面積の求め方はどうするのか考えたが,サンプルにそれは書いてあった.問題自体は簡単であるが,この問題のポイントは計算の精度である.出力する際の精度に気をつける必要があり,自分はそれで 2,3 回 WA をくらってしまった.
WA の原因はおそらく計算精度だろうとは勘付き,ローカルでの表示と AtCoder のコードテストでサンプルを実行してみたところ, std::cout
の出力の精度が合っていないということが分かった.問題の条件には「 答えは、相対誤差または絶対誤差が 以下であれば許容される」とあったが,コードテストでは小数点第 4 位で四捨五入された数値が出力されていたのである.これが WA の原因だった(e.g.) 3.141592
が欲しいところを3.1416
と出力してしまう).
これを解決するには,std::cout
の出力の精度を変える必要があった.下記の記事を見ながら,標準ライブラリ <iomanip>
の std::setprecision
を用いて出力の精度をうまく調節して無事 AC となった.
解法
特に難しいことはない.最後の出力に精度が必要になるため,std::setprecision
を用いている,という点だけは注意.必要な精度は,「整数部分の最大桁数 + 小数点以下に必要な精度分の桁数」であるため,この問題では,整数部分 (与えられる半径の最大値)より 桁,小数点以下に必要な精度 より 桁分を出力するように指定した.こうしておけば,計算結果が大きな値になっても小数点部分の精度は保たれる.AC したコードは以下.
気づき
小数点以下の精度が必要な計算には数値型に
double
を用いる.環境により標準出力のされ方が違うため,精度が求められる問題ではコードテストで確認をしてみた方が良い.WA でペナルティをくらうよりは時間は無駄にならない.