AIZU ONLINE JUDGE

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

AOJ_ITP1_3

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

ITP1 のトピック3では、繰り返し処理を学びます。「条件に従って処理を繰り返し、反復処理を行う構造文を学習します。」とあります。Rust 入門として解いていきます。

問題(3_A: Print Many Hello World)

問題のリンク先:AOJ ITP1 3_A問題:Print Many Hello World

for 文を使って書いてみます。範囲の指定は、Python の range に近い表記を使います。識別子 _ は右辺値として参照できません。「名前を気にしない」という識別子です。

fn main() {
    for _ in 0..1000 {
        println!("Hello World");
    }
}

問題(3_B: Print Test Cases)

問題のリンク先:AOJ ITP1 3_B問題:Print Test Cases

無条件の繰り返しは、loop 文を使います。break で抜けるのは、C/C++ と同じです。

fn main() {
    let mut count = 1;
    loop {
        let mut s = String::new();
        std::io::stdin().read_line(&mut s).unwrap();
        let x: i32 = s.trim().parse().unwrap();
        if x == 0 {
            break
        }
        println!("Case {}: {}", count, x);
        count += 1;
    }
}

問題(3_C: Swapping Two Numbers)

問題のリンク先:AOJ ITP1 3_C問題:Swapping Two Numbers

3_B の問題と構造は同じですが、2変数を読み込みます。読み込む整数 x と y がどちらも 0 になれば無限ループを抜けます。

fn main() {
    loop {
        let mut s = String::new();
        std::io::stdin().read_line(&mut s).unwrap();
        let mut ws = s.trim().split_whitespace();
        let x: i32 = ws.next().unwrap().parse().unwrap();
        let y: i32 = ws.next().unwrap().parse().unwrap();
        if x == 0 && y == 0 {
            break
        }
        if x < y {
            println!("{} {}", x, y);
        } else {
            println!("{} {}", y, x);
        }
    }
}

問題(3_D: How Many Divisors?)

問題のリンク先:AOJ ITP1 3_D問題:How Many Divisors?

トピック3の最後として、繰り返し、条件判断を行う応用として、約数となっている数の個数を求めるプログラムを作ります。a <= i <= b とするために「右側を含む範囲演算子」を使っています(9行目)。

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 c: i32 = ws.next().unwrap().parse().unwrap();
    let mut divisor = 0;
    for i in a..=b {
        if c % i == 0 {
            divisor += 1;
        }
    }
    println!("{}", divisor);
}

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

最後に

Rust の習熟度を上げるために、このコースを活用することにしました。繰り返し文については、Python とも C/C++ とも異なる文法を採用していることが学べました。

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

COMMENT

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

CAPTCHA