大学入試の数学問題をRustで求めてみる

大学入試で、東京理科大学で出た数学の問題ということです。 今の私にも考えれば出来るかなって思った問題でしたが、やっぱり分かりませんでした(涙)

【問題】

ある2桁の正の整数mを2乗すると、下2桁が36になる時、mの値は?
という問題です。
ちょっと面白そうな問題だったので、今勉強中のRustで答えを出してみました。
数学的なコードではないですが、動画の答えと合いました。良かった。
use std::collections::HashMap;

fn question(x: u64) -> u64 {
    let x_times;
    let under2keta: u64;

    let fix_num = 100;   // 下2桁を00にするための変数

    // (条件)二乗する
    x_times = x.pow(2);
    // 文字列に変換してから後ろ2文字を取得しようと思ったが止めた
    // let x2_str: String = x_times.to_string();

    // 下2桁を取得
    // 512 -> 500, 1024 -> 1000 のような数値にする処理(下2桁を00へ変換)
    let x_roundup = (x_times / fix_num) * fix_num as u64;   // 小数以下を切り捨てて、桁を元に戻す
    under2keta = x_times - x_roundup;                       // Ex) 72 = 572 - 500 こんな感じで下2桁が返るはず

    return under2keta
}

fn main() {
    let target_number = 36;  // (条件)下2桁がこの数値となるmを求める
    // ある2桁の整数 [0..99]とかしたほうがいいのかも
    let mut i = 10;
    let max_i = 99;

    // let mut ans = vec![];  // (配列の場合)
    let mut ans = HashMap::new();  // 辞書型使う

    loop {
        let rtn = question(i);  // ループの中でmutはなくても、同じ変数名は使えるようだ
        if rtn == target_number {
            // ans.push(i);  // i^2の下2桁が36に等しかったらiを退避(配列の場合)
            ans.insert(i, i.pow(2));  // i^2の下2桁が36に等しかったらiを退避
        }

        if i > max_i {
            break;
        }
        i += 1;
    }

    // println!("Ans. is {:?}.", ans);  // (配列の場合)
    for (k, v) in &ans {
        println!("{} -> {}", k, v);
    }
}
私はパソコン使って答え出せますが、受験生は自分の頭1つで、しかも時間内に解かないといけないから大変ですね。
因みに最後にお伝えいたしますが、動画の先生と同じく、東京理科大学(物理科)は私の出身大学です。
以上になります

こういうブログもありました。

人気のあるブログ:

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください