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.
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.
Działa od wersji >= 1.8.7 (nie było metody Array#product w <= 1.8.6)
a, b = (100..999).to_a.product((100..999).to_a).
select {|a, b| "#{a * b}" == "#{a * b}".reverse }.
max_by {|a, b| a * b }
puts "#{a} x #{b} = #{a * b}"
Wersja mniej kompaktowa, ale za to omijająca połowę mnożeń (liczenie ba gdy już mamy ab) i sprawdzająca „palindromowatość” tylko do pierwszego trafienia:
products = []
(100..999).each do |a|
(100..a).each do |b|
products << [a, b, a*b]
end
end
products = products.sort_by(&:last).reverse
products.find { |a, b, prod| prod.to_s == prod.to_s.reverse } # => [993, 913, 906609]
[code=Ruby]max = 0
(100…999).each {|i| (100…999).select {|j| max = i * j if (i * j > max) && ((i * j).to_s == (i * j).to_s.reverse)}}
p max
=> 906609[/code]
Moje rozwiązanie:
[code=Ruby]a,b = Array.new, Array.new
(110…999).step(11) do |n|
a.unshift(n)
end
a.each do |n|
999.downto(n).each do |m|
num = n*m
b << num if (num == num.to_s.reverse.to_i)
end
end
puts b.max[/code]
Array to klasa
tylko na co ta tablica z palindromami, skoro potrzebny Ci tylko jeden - największy? wrzucanie w pętli do drugiej tablicy z Range’a też bez sensu…
[code=ruby]max, range = 0, (110…999).step(11).to_a
def palindrome?(n)
n == n.to_s.reverse.to_i
end
range.reverse_each do |n|
999.downto(n).each do |m|
num = n*m
if palindrome?(num) && num > max
max = num
break # nie ma co liczyć dla następnego m
bo na bank będzie mniejszy
end
end
end
puts max[/code]