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 の問題を紹介していきます。