Think Twice
IT技術メモ | プログラミングお題のメモ
Created: 2012-08-05 / Updated: 2023-09-04

[お題] Project Euler Problem 4 最大の回文積


当メモは2012-08-05に投稿されたものを加筆修正し、再掲したものです。
みなさまもお好きな言語で解いてみてくださいね。

目次


お題

英語
Copy
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.
日本語
Copy
左右どちらから読んでも同じ値になる数を回文数という.
2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
では, 3桁の数の積で表される回文数の最大値を求めよ.

3桁の数を二つ掛けた場合に回文になる最大の数を示せって問題ですね。

Groovyで解いてみた

2012-08-05 更新
Copy
Number.metaClass {
  isPalindromicNumber = {
    delegate.toString().with{ it == it.reverse() }
  }
  getDigits = {
    delegate.toString().size()
  }
}

class PalindromicNumbers implements Iterable {
  int n = 999*999
  int end = 100*100
  def digit3 = null
  @Override Iterator iterator() { [
    hasNext : { true },
    next : {
      if (digit3) {
        def r = digit3.head()
        digit3 = digit3.tail()
        return r
      }
      while (n > end) {
        if (n.palindromicNumber) {
          digit3 = (999..100).collect{ [n:n, d1:it, d2:n/it, result:n % it == 0] }.findAll{ it.result }
          if (digit3) {
            n--
            def r = digit3.head()
            digit3 = digit3.tail()
            return r
          }
        }
        n--
      }
    }
  ] as Iterator }
}

def result
new PalindromicNumbers().takeWhile{
  if (it.d1.digits == 3 && it.d2.digits == 3) {
    result = it
  }
  !result
}

assert result == [n:906609, d1:993, d2:913, result:true]

他の方のGroovyでの回答

参照

関連メモ

2023-09-04 更新

参考

参考サイト

ソース

参照