AtCoder Beginner Contest 239 A

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);
}