https://atcoder.jp/contests/abc239/tasks/abc239_a
平方根を取るには
let d = (H * (12800000.0 + H)).sqrt();
とすればよいですが、f64のメソッドなのが気に入らないので関数を自作しましょう。
fn sqrt(x: f64) -> f64 { fn f(x: f64, y: f64) -> f64 { let y1 = (y + x / y) / 2.0; if (y1 - y).abs() < y * 1e-9 { y1 } else { f(x, y1) } } f(x, x) }
関数内に関数が作れるんですね。
// Horizon #![allow(non_snake_case)] fn read<T: std::str::FromStr>() -> T { let mut line = String::new(); std::io::stdin().read_line(&mut line).ok(); line.trim().parse().ok().unwrap() } fn sqrt(x: f64) -> f64 { fn f(x: f64, y: f64) -> f64 { let y1 = (y + x / y) / 2.0; if (y1 - y).abs() < y * 1e-9 { y1 } else { f(x, y1) } } f(x, x) } fn main() { let H: f64 = read(); let d = sqrt(H * (12800000.0 + H)); println!("{}", d); }