LoginSignup
2
0

More than 3 years have passed since last update.

【Python】 プロジェクトオイラー Problem 4

Last updated at Posted at 2019-07-02

左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.

では, 3桁の数の積で表される回文数の最大値を求めよ.

Problem2はこちらから

解くために必要なことは

三桁かける三桁の計算

左右から読んで同じ数字を抜き出す

その中の最大の値を求める

で、できるはず

とりあえず①に関しては、for関数を使えばなんとかなりそう

②には今のところ全く解き方が思い浮かばないのでググる

③は抜き出した数値を変数に「今の変数の値より大きいときのみ」上書きすればできるはず

ということでとりあえず①から解いてみる


for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b

        print(seki)

99900
100899
101898
102897
省略
995004
996003
997002
998001

端折りましたがかなりの数が出てきたので多分成功しているはず

これで変数sekiに3桁かける3桁の解を1回は出力させれたはずなので

②の回文数の求め方をググります

びっくりするくらいぴったりのやり方を見つけられた

[https://qiita.com/okkn/items/54e81346d8f35733ab5e:title]

ここのサイト曰く

逆順にしたけりゃ[リストor文字列][::-1]にしとけ!!

とのことなので[::-1]を使えばリストの中の数字が逆順になるらしい

試してみる

a = [1,2,3,4,5,6,7,8,9]
print(a[::-1])

[9,8,7,6,5,4,3,2,1]

逆順になっているのでこのまま②の部分までプログラムを作ってみる。

とりあえず、[::-1]を使って逆順にした変数と元の変数がイコールの時のみ抜き出したい。

for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b
                seki_gyaku = seki[::-1]
                if seki == seki_gyaku:
                    kaisuu = seki
                    print(kaisuu)

エラーが出てしまった...

何が違うのか考える。

先ほどのサイトに答えが書いてあった...

[::-1]を使えるのは、リストか文字列のみみたい

書き直してみる

for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b
                seki_gyaku = str(seki[::-1])
                if seki == seki_gyaku:
                    kaisuu = seki_gyaku
                    print(kaisuu)

またもやエラー

調べてるうちに

if seki == seki_gyaku:

のsekiとseki_gyakuとで属性がちがうらしい

詳しく言うと、sekiはint(整数)でseki_gyakuはstr(文字列)とのこと

考えてみれば、strで属性を変えたものと変える前を比べたらできないのが当たり前かも

というわけで同じstr同士でif文を作てっみる

for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b
                seki_gyaku = str(seki)
                if seki_gyaku == seki_gyaku[::-1]:
                    kaisuu = seki_gyaku
                    print(kaisuu)


省略
282282
119911
906609
514415
580085

いろいろ出てきたけど回数文しか出てきてないから成功のはず

あとは最大値を抜き取るだけ

最大値はif文を使えばできそう

とりあえずkotaeという変数を用意してそこに答えを詰め込む

kotae = 0
省略
if seki_gyaku == seki_gyaku[::-1]:
                    kaisuu = seki_gyaku
                    if kaisuu > kotae:
                        kotae = kaisuu
                        print(kotae)

先ほどの続きで書いたけどエラー

でもこれはすぐわかった

さっきと同じでint型とstr型を比べているから

なんとかkaisuuをstr型からint型にしたい

ググる

[https://note.nkmk.me/python-str-num-conversion/:title]

int()でint型にできるらしい

ということで

kotae = 0
for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b
                seki_gyaku = str(seki)
                if seki_gyaku == seki_gyaku[::-1]:
                    kaisuu = seki_gyaku
                    if int(kaisuu) > kotae:
                        kotae = int(kaisuu)
print(kotae)

906609

[http://kingyojima.net/pje/004.html:title]

あってるーーーー

Problem5はこちらから

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0