O enfoque aqui será o de implementar a solução tendo por base o método de busca de palíndromos que utilizamos no post Invertendo String e Palíndromos. Também, utilizaremos o fato de que estamos a procura do maior palíndromo, logo faz mais sentido começarmos a busca pelos números mais altos, dividindo a busca em intervalos [999-900], [899-700], etc. Assim sendo, quando encontrarmos um palíndromo, certamente será o maior, pois estamos multiplicando números maiores do que os intervalos que se seguirão. A busca então pode ser interrompida, acelerando a resposta.
Function ehPalindromo($pal) { $reversePal = -join([System.Linq.Enumerable]::Reverse($pal)) if ($pal -eq $reversePal) { Return $true } else { Return $false } } Function VerPalNoIntervalo([Int32]$int1, [Int32]$int2) { [Int32]$max = 0 For ($i=$int1; $i -gt $int2; $i--) { For ($j=$int1; $j -gt $int2; $j--) { If (ehPalindromo ([String]($i*$j))) { If (($i * $j) -gt $max) { $max = $i * $j Write-Host "Palíndromo entre $i * $j = $max" Return $max } } } ## for $j } ## for $i Return 0 } Clear-Host [Int32]$i=999 For ([Int32]$j=899; $j -gt 100; $j-=100) { $i = $j + 100 If (VerPalNoIntervalo $i $j) { Write-Host "O maior palíndromo encontrado de 3 dígitos foi: $max" Break } }
Na implementação, a função ehPalindromo retorna $true se o número em questão é palíndromo. A função VerPalNoIntervalo recebe um intervalo, por exemplo [999-900], e verifica se há um palíndromo nesse intervalo - a verificação é feita chamando a função ehPalindromo.
No corpo principal, foi construído um loop que chama a função VerPalNoIntervalo passando os intervalos de busca. Conforme dito, como a busca está sendo feita a partir dos números maiores, em bloco, ao ser encontrado um palíndromo é seguro deduzir que é o maior.
Palíndromo entre 993 * 913 = 906609 O maior palíndromo encontrado de 3 dígitos foi: 906609
Nenhum comentário:
Postar um comentário