Proyecto Euler Problema 4

He creado una solución al problema 4 en el Proyecto Euler. Sin embargo, lo que encuentro es que colocar la statement de impresión (que imprime la respuesta) en diferentes ubicaciones imprime respuestas diferentes. Y por alguna razón, el valor más alto del resultado es 580085. ¿No debería ser 906609? ¿Hay algún problema con mi método isPalindrome ()?

#include  #include  int isPalindrome(int n); //Find the largest palindrome made from the product of two 3-digit numbers. int main(void) { int i = 0; int j = 0; int result = 0; int palindrome = 0; int max = 0; //Each iteration of i will be multiplied from j:10-99 for(i = 100; i <= 999; i++) { for(j = 100; j  max) { max = result; //printf("Largest Palindrome: %d\n", max); //927340 } printf("Largest Palindrome: %d\n", max); //906609 } } } //printf("Largest Palindrome: %d\n", max); //998001 system("PAUSE"); return 0; } //End of main //Determines if number is a palindrome int isPalindrome(int num) { int n = num; int i = 0; int j = 0; int k = 0; int count = 0; int yes = 0; //Determines the size of numArray while(n/10 != 0) { n%10; count++; n = n/10; } int numArray[count]; //Fill numArray with each digit of num for(i = 0; i = 3) { return 0; } }//End of Function 

Recuerdo haber hecho ese problema hace un tiempo y simplemente hice una función is_palindrome() y la is_palindrome() . Comencé a probar desde 999 * 999 hacia abajo.

Mi enfoque para detectar un palíndromo era bastante diferente del tuyo. Convertiría el número dado en una cadena y compararía el primer char con el nth char, el segundo con n-1 y así sucesivamente.

Era bastante simple (y podría ser ineficiente también) pero la respuesta surgiría “al instante”.

No hay problema en el código para encontrar el número.
Según su fragmento de código:

 . . } printf("Largest Palindrome: %d\n", max); //906609 } } } //printf("Largest Palindrome: %d\n", max); //998001 system("PAUSE"); . . . 

obtiene el resultado tan pronto como se encuentra un número de palíndromo multiplicando el número hacia abajo.

Debe almacenar el palíndromo en una variable máx. Y dejar que el código continúe, ya que existe la posibilidad de encontrar un palíndromo mayor.

Tenga en cuenta que para i=800,j=500 , entonces i*j será mayor cuando se compara con i=999,j=100 . Solo entiende la lógica aquí.

Algunos problemas en la función isPalindrome :

  • el primer bucle while no cuenta el número de dígitos en el número, pero cuenta uno menos.
  • como resultado, la matriz numArray es demasiado pequeña (asumiendo que su comstackdor admite la creación de la matriz como esa para comenzar)
  • el bucle for está escribiendo un valor más allá del final de la matriz, en el mejor de los casos sobrescribiendo otra ubicación de memoria (posiblemente importante).
  • el segundo bucle while no tiene una condición final definida correctamente; puede comparar felizmente los valores más allá de los límites de la matriz.
  • Debido a eso, el valor en yes es potencialmente incorrecto, y el resultado de la función también lo es.
  • no devuelve nada si la función no detecta un palíndromo.
 //Determines if number is a palindrome bool isPalindrome(int num) // Change this to bool { int n = num; int i = 0; int j = 0; int k = 0; int count = 1; // Start counting at 1, to account for 1 digit numbers int yes = 0; //Determines the size of numArray while(n/10 != 0) { // n%10; <-- What was that all about! count++; n = n/10; } int numArray[count]; //Fill numArray with each digit of num for(i = 0; i < count; i++) // This will crash if you use index=count; Array indices go from 0 to Size-1 { numArray[i] = num%10; //printf("%d\n", numArray[i]); num = num/10; } //Determines if num is a Palindrome /* while(numArray[k] == numArray[count-1]) // Again count-1 not count; This is really bad though what if you have 111111 or some number longer than 6. It might also go out of bounds { k = k + 1; count = count - 1; yes++; } */ for(k = 1; k <= count; k++) { if(numArray[k-1] != numArray[count-k]) return false; } return true; }//End of Function 

Eso es todo lo que pude encontrar.

También necesitas cambiar esto.

 if(isPalindrome(result) == 0) 

A

 if(isPalindrome(result)) 

La salida del código después de hacer las modificaciones: enlace

El printf correcto es el que está después de for, después de iterar a través de todos los valores posibles

Está utilizando int para almacenar el valor del palidrome, pero su resultado es mayor que 65536, debe usar unsigned

 result = i * j; 

Este pice de código es incorrecto:

 while(n/10 != 0) { n%10; count++; n = n/10; } 

debería ser:

 while(n != 0) { count++; n = n/10; } 

Así como los cambios que PR sugirió.

Puedes hacer algo como esto para averiguar si el número es palíndromo:

 int isPalindrom(unsigned nr) { int i, len; char str[10]; //convert number to string sprintf(str, "%d", nr); len = strlen(str); //compare first half of the digits with the second half // stop if you find two digits which are not equal for(i = 0; i < len / 2 && str[i] == str[len - i - 1]; i++); return i == len / 2; } 

Convertí el número a String para poder revisar el número como una matriz de caracteres:

 private static boolean isPalindrom(long num) { String numAsStr = String.valueOf(num); char[] charArray = numAsStr.toCharArray(); int length = charArray.length; for (int i = 0 ; i < length/2 ; ++i) { if (charArray[i] != charArray[length - 1 - i]) return false; } return true; } 

Tengo la respuesta correcta para el problema, pero quiero saber si mi estilo de encoding es bueno o malo de mi solución. Necesito saber cómo puedo mejorar mi encoding, si es una manera mala y más genérica.

 #include #define MAX 999 #define START 100 int main() { int i,j,current,n,prev = 0; for(i = START;i<=MAX;i++) { for(j=START;j<=MAX;j++) { current = j * i; if(current > prev) /*check the current value so that if it is less need not go further*/ { n = palindrome(current); if (n == 1) { printf("The palindrome number is : %d\n",current); prev = current; // previous value is updated if this the best possible value. } } } } } int palindrome(int num) { int a[6],temp; temp = num; /*We need a array to store each element*/ a[5] = temp % 10; a[4] = (temp/10) %10; a[3] = (temp/100) %10; a[2] = (temp/1000) %10; a[1] = (temp/10000) %10; if(temp/100000 == 0) { a[0] = 0; if(a[1] == a[5] && a[2] == a[4]) return 1; } else { a[0] = (temp/100000) %10; if(a[0] == a[5] && a[1] == a[4] && a[2] == a[3]) return 1; else return 0; } }