🖥️

AtCoderの問題をRustで解いてみる (ネタバレ注意) #4

2024/02/28に公開

EX4. ◯年は何秒?

こんにちは、竹薮林です。今回はEX4を解きましょう。

↓前回はこちら↓
https://zenn.dev/banboo0427/articles/041c89c3560b92

問題文

次のプログラムをコピー&ペーストして、指定した場所にプログラムを追記することで問題を解いて下さい。

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