これは、次のようなa、b、cを見つけることと同じです。
100*a + 10*b + c = 11 * (a*a + b*b +c*c)
つまり100*a + 10*b + c、11で割り切れる必要があります。単純な数論では、a、b、cが数字の場合、これは次のことを意味します。
`a + c - b`
11の倍数でなければならないので
`a + c = b or a + c = 11 +b`
したがって、aとbの特定の値については、10ではなくc:b-aと11+b-aの2つの値をチェックするだけで済みます。検索スペースをもう一度2つにカットできます。これら2つの値の後者を確認し、a <= bの場合は、前者のみを確認する必要があります。
したがって、1000トリプレットの数値をチェックする代わりに、100をチェックするだけで済みます。これは10倍高速である必要があります。
for a in 0..9
for b in 0..9
if a > b
c = 11 +b -a
else
c = b - a
end
if a*a+b*b+c*c == (100*a+10*b+c)/11.0
puts "#{a}#{b}#{c}"
end
end
end