【Project Euler】最大の回文数は?【プログラミング】
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【Project Euler】最大の回文数は?【プログラミング】

2018-03-11 19:00

    Problem 4: Largest Palindrome Product
    ----------------------------------------------------------------------------------------------


     魔理沙~、この前は大丈夫だった?

     あ、霊夢じゃん!
     大丈夫大丈夫、あの後すっかり良くなったからさ!

     飲みすぎは程々にしてね?
     じゃあ今日もやっていこうかな!


     お~!

    A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.

    Find the largest palindrome made from the product of two 3-digit numbers.


     えっと…今回はなんて書いてあるの?


     今回はこんな感じで書いてあるよ

    回文数とは、どの方向から読んでも同じになる数字のことである。例えば、2桁同士の数字の掛け算で見つかる最大の回文数は9009=91×99だ。

    では、3桁同士の数字の掛け算でできる最大の回文数は?

     回文数ってのは初めて聞いたな
     回文はよく小学校とかで習うよね!


     「トマト」とか「しんぶんし」とかだね

     どや顔しながら言うことじゃないぞ 笑
     さて、じゃあ早速コード書いていこう!


     じゃあまず私から

    # モジュールを読み込む
    import numpy as np

    # 三桁の数字を作成
    val = np.arange(100, 1000)

    # 全ての数字を掛け合わせる
    multiples = [x*y for x in val for y in val]
    #
    multiples = map(str, multiples)

    # 数字を反転する
    inverse = filter(lambda x: x == x[::-1], multiples)
    #
    maxval = max(map(int, inverse))


     簡単に説明すると、

    1.総当たりで、三桁同士の掛け算全ての結果を計算する
    2.map関数で文字列に変換
    3.filter関数を用いることで、回文数を抽出
    4.map関数でintに戻して、max関数を用いる

     意外と簡単にできるんだね
     C++で書くとこんな感じだよ

    #include <iostream>

    /* 入力した数値を反転して出力する */
    int num_reversed(int original) {
     /* 初期値を設定する */
     int reversed = 0;

     /* 各桁を順番に入れ替える */
     while (original>0) {
      reversed = original % 10 + reversed * 10;
      original = original / 10;
     }
     
     return reversed;
    }

    int main(void) {
     /* 初期値を設定する */
     int maxVal=0, val[900];

     for (int i=0; i<900; ++i) {
      val[i] = i + 100;
     }
     
     for (int x: val) {
      for (int y: val) {
       /* 掛け算を計算する */
       int tmpVal = x * y;
       
       if ((tmpVal==num_reversed(tmpVal)) && (maxVal<tmpVal)) {
        maxVal = tmpVal;
       }
      }
     }
     
     return 0;
    }

     C++はmax関数みたいなのはないから、一個一個掛け算を計算して
     比較してみたよ

     Pythonゆえに使える技だからね、あれは
     でも実はBoost関数を使うと、C++でもNumpyとか使えるんだよ

     そうなの!?それは今度使ってみたいなあ
     機会があれば試してみるね!

     うん、是非是非!
     じゃあ皆さん、次の機会に!


    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。