AIZU ONLINE JUDGE

AOJ ITP1 トピック#4をRustで解く

AOJ_ITP1_4

Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)のトピック#4の4問をRustで解いてみました。

ITP1 のトピック4では、計算について学びます。「計算式に用いられる様々な演算子を学習します。」とあります。Rust 入門として解いていきます。

問題(4_A: A / B Problem)

問題のリンク先:AOJ ITP1 4_A問題:A / B Problem

整数型 i32 と、浮動小数点型 f64 を使い分けます。println!文で最後の式について {:.5} と指定して、小数点以下を5桁出力しています。

fn main() {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    let mut ws = s.trim().split_whitespace();
    let a: i32 = ws.next().unwrap().parse().unwrap();
    let b: i32 = ws.next().unwrap().parse().unwrap();
    let f_a: f64 = a as f64;
    let f_b: f64 = b as f64;
    println!("{} {} {:.5}", a / b, a % b, f_a / f_b);
}

問題(4_B: Circle)

問題のリンク先:AOJ ITP1 4_B問題:Circle

Rust の円周率は std::f64::consts::PI で参照できます。

fn main() {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    let r: f64 = s.trim().parse().unwrap();
    println!("{:.5} {:.5}", std::f64::consts::PI * r * r, std::f64::consts::PI * 2.0 * r);
}

問題(4_C: Simple Calculator)

問題のリンク先:AOJ ITP1 4_C問題:Simple Calculator

整数2つと演算子を1つを含む、非常に簡単な1行計算機を実装します。繰り返し処理、条件分岐処理を使う応用になっています。

fn main() {
    loop {
        let mut s = String::new();
        std::io::stdin().read_line(&mut s).unwrap();
        let mut ws = s.trim().split_whitespace();
        let a: i32 = ws.next().unwrap().parse().unwrap();
        let op: char = ws.next().unwrap().parse().unwrap();
        let b: i32 = ws.next().unwrap().parse().unwrap();
        if op == '+' {
            println!("{}", a + b);
        } else if op == '-' {
            println!("{}", a - b);
        } else if op == '*' {
            println!("{}", a * b);
        } else if op == '/' {
            println!("{}", a / b);
        } else if op == '?' {
            break;
        }
    }
}

問題(4_D: Min, Max and Sum)

問題のリンク先:AOJ ITP1 4_D問題:Min, Max and Sum

一連の数列を読み取り、最小値、最大値、合計を求めます。

fn main() {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    let n: i32 = s.trim().parse().unwrap();
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    let mut ws = s.trim().split_whitespace();
    let mut minimum: i64 = 1000001;
    let mut maximum: i64 = -1000001;
    let mut sum: i64 = 0;
    for _ in 0..n {
        let a: i64 = ws.next().unwrap().parse().unwrap();
        if a < minimum {
            minimum = a;
        }
        if a > maximum {
            maximum = a;
        }
        sum += a
    }
    println!("{} {} {}", minimum, maximum, sum);
}

ここで紹介したすべてのプログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されました。

最後に

Rust の習熟度を上げるために、このコースを活用することにしました。Rust は型変換について、C/C++ より厳密に扱うことが学べました。

引き続き、Rust で ITP1 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA