Así que el Proyecto Euler las Problem 4 indica lo siguiente:Encontrar el mayor palíndromo del producto del problema de dos números de tres dígitos
Un capicúa lee los mismos en ambos sentidos. El mayor palíndromo hizo partir del producto de dos números de 2 dígitos es 9009 = 91 99.
encuentra la mayor palíndromo hecha de el producto de dos números de 3 dígitos.
He intentado lo siguiente:
#include <stdio.h>
#include <stdlib.h>
int check(int result)
{
char b[7];
sprintf(b, "%d", result);
if (b[0] == b[5] && b[1] == b[4] && b[2] == b[3])
{
return 1;
}
else
{
return 0;
}
}
int main() {
int i;
int g;
int final;
for (i = 999; i > 99; i--)
{
for (g = 999; g > 99; g--)
{
if (check(g*i) == 1)
{
final = g*i;
goto here;
}
}
}
here:
printf("%d", final);
}
embargo, esto no funciona. En lugar de la respuesta correcta, obtengo 580085, que supongo que es un palíndromo al menos, pero todavía no es la respuesta correcta.
Voy a explicar mi programa a partir de int main
:
int i
yint g
son mis multiplicadores. Son esos dos números de tres dígitos.int final
es el número que almacenará el palíndromo más grande.- Comienzo dos veces para que los bucles vayan hacia abajo para obtener todas las posibilidades numéricas.
- Salgo del ciclo usando un goto cuando se alcanza el primer palíndromo (probablemente no debería, pero no afecta demasiado a un pequeño programa como este).
- El primer palíndromo debería ser el más grande posible ya que estoy contando hacia abajo desde la parte superior.
Permítanme ahora explicar mi cheque:
- En primer lugar, ya que estos son dos números de tres dígitos que se multiplican entre sí para determinar el tamaño de un char tendría que ser para mantener ese valor Fui a una calculadora y multipliqué 999 * 999 y terminó siendo 6, entonces necesito agregar uno porque descubrí a partir de una de las preguntas que publiqué anteriormente que
sprintf
pone un carácter\0
al final. - Bien, ahora que tengo un char y todo, copié
result
(quei*g
enint main
) y lo puse enchar b[7]
. - Luego, acabo de verificar
b
para ver si se igualaba con la codificación de cada ranura que necesitaba verificar. - Luego regresé en consecuencia, 1 para verdadero y 2 para falso.
Esto me parece perfectamente lógico, pero no funciona por algún motivo extraño. ¿Algún consejo?
Su "g" se va a transcurrir demasiado rápido - es posible encontrar un palíndromo basado en, digamos, 999 * 101, pero la respuesta real es más como 997 * 867 que es más grande. – bstpierre
Un consejo: la multiplicación es conmutativa, por lo que puede tener 'para (g = i; g> 99; g -)' para evitar la prueba de ambos '999 * 100' y' 100 * 999'. –
Por cierto, este es un uso legítimo para goto –