AtCoderの問題をRustで解いてみる (ネタバレ注意) #4
EX4. ◯年は何秒?
こんにちは、竹薮林です。今回はEX4を解きましょう。
↓前回はこちら↓
問題文
次のプログラムをコピー&ペーストして、指定した場所にプログラムを追記することで問題を解いて下さい。
fn main() {
// 1年の秒数
let seconds: usize = 365 * 24 * 60 * 60;
// 以下のコメント/* */を消去して追記する
println!("{}", /* 1年は何秒か */);
println!("{}", /* 2年は何秒か */);
println!("{}", /* 5年は何秒か */);
println!("{}", /* 10年は何秒か */);
}
変数seconds
は一年の秒数を表しています。これを利用して
- 1年は何秒か
- 2年は何秒か
- 5年は何秒か
- 10年は何秒か
を順に一行ずつ表示するプログラムを作って下さい。
うるう秒やうるう年のことは考え無くて良いとします。
実行結果(一部を「?????」で隠しています)
31536000
63072000
?????
?????
この問題を解く前に、Rustにおける変数と型の説明をしましょう。
変数と型の説明
こちらの問題を解くためには、変数と型について知る必要があります。今回はそちらを説明します。
変数について
変数とは、値を格納するオブジェクトに名前をつけたものです。他の言語でもよく使用されています。簡単に言うと、何かを収納する箱のようなものです。
Rustでの変数の宣言は次のようにして行います。
let x;
こちらはx
という変数を宣言しています。しかし、宣言しただけです。中には何も入っていません。
let x;
x = 12;
このように書くと、変数x
の中に12を代入します。=
は、左辺の変数に右辺の値を代入するという意味です。
また、次のように、宣言と代入を同時に行うこともできます。
let x = 12;
このように、変数に最初に値を代入することを初期化といいます。
では、変数を使用するとどんなことができるでしょうか?
fn main() {
let x = 10;
println!("{}", x);
println!("{}", x + 3);
}
これは次のように出力します。
10
13
数字を代入している変数には前回紹介したような演算も可能です。
また、変数の中身を変えたいときは、次のように、宣言時にmut
をつけて、ミュータブル変数にする必要があります。
fn main() {
let mut x = 6;
x = 8;
println!("{}", x);
}
型について
型とは、変数に格納する値の種類のことです。次のように、Rustでは複数の型が存在します。
fn main() {
let a = 10;
let b = 5.5;
let c = "Hello";
println!("{} {} {}", a, b, c);
}
10 5.5 Hello
上から順に、整数型、浮動小数点型、文字列型です。
整数型は、今までもよく扱ってきたものですね。その名の通り、整数を扱うことが可能です。
また、整数型の中にも型が複数存在します。よく使うものを上げると、符号付き整数 (正の整数、0、負の整数) を扱うi32
型 (その他i64
型など) や、符号なし整数 (0以上の数) を扱うu32
型 (その他usize
型や'u64'型など) などがあります。それぞれの数字は、bit数を表しており、bitが大きいほど、大きな整数を扱うことができます。
型の宣言は、変数名の後に: 変数名
で補足するか、値の最後に_変数名
をつけることで行うことができます。
let x: i32 = -5;
let y = 10000000_usize;
浮動小数点型は、小数を扱うことができます。f64
型などがよく用いられます。また、整数の後に.
だけを追加すると、浮動小数点型となり、その値は小数点以下が全て0となります。
let x: f64 = 3.14159;
let y = 2.78_f32;
let z = 10.; // 10.0と同等
文字列型は、その名の通り、文字列を扱います。よく使うものには、&str
型やString
型、今後登場する、文字の配列であるVec<char>
型などがあります。何もつけずに宣言したときは&str
型になります。String
型にするには、複数の方法があります。
let x = "Hello"; // &str型、 let x: &str = "Hello"; と同等
let y = String::from("abcd"); // String型
let z = "efg".to_string(); // String型
それでは、以上の点を踏まえて、今回の問題を解いていきましょう。
EX4を解いていく
今回の問題ですが、注目すべきは
let seconds = 365 * 24 * 60 * 60;
の部分です。こちらの部分では、変数の宣言と代入を同時に行っています。
コメントで説明されているように、seconds
という変数には一年の秒数をusize
型で代入しています。では、下のprintln!()
マクロ内に変数を使用して記述していきましょう。
1年のところには、そのままseconds
と入力すれば大丈夫です。
2年のところには何を書けば良いでしょうか?
先ほど説明したように、変数では足し算やかけ算などの演算が可能です。2年の秒数は、1年の秒数に2をかければ良いですよね。なので、次のように書くことができます。
println!("{}", seconds * 2);
同様に、5年の秒数のところは5をかけて、10年の秒数のところは10をかけましょう。
提出するコードは次のようになるはずです。
fn main() {
// 1年の秒数
let seconds: usize = 365 * 24 * 60 * 60;
println!("{}", seconds);
println!("{}", seconds * 2);
println!("{}", seconds * 5);
println!("{}", seconds * 10);
}
実行結果は次のようになります。
31536000
63072000
157680000
315360000
こちらで提出すると、AC
することができます。
今回はRustでの変数と型について学習し、EX4を解きました。次回はEX5です。最後まで読んでいただきありがとうございました。
Discussion