Проект Эйлера Проблема 4

Я создал решение проблемы 4 в Project Euler. Тем не менее, я нахожу, что размещение оператора печати (который печатает ответ) в разных местах печатает разные ответы. И по какой-то причине наибольшее значение результата – 580085. Разве это не должно быть 906609? Что-то не так с моим методом 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 

Я помню, как это делал некоторое время назад, и я просто создал функцию is_palindrome() и принудительно принудительно. Я начал тестировать с 999 * 999 вниз.

Мой подход к обнаружению палиндрома отличался от вашего. Я бы преобразовал заданное число в строку и сравнил первый символ с nth char, второй с n-1 и так далее.

Это было довольно просто (и могло бы быть неэффективным тоже), но ответ получился «мгновенно».

В коде нет проблемы с поиском номера.
Согласно fragmentу кода:

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

вы получаете результат, как только обнаруживается число палиндрома, умножающее число вниз.

Вы должны сохранить палиндром в переменной max и позволить коду работать дальше, так как есть возможность найти больший палиндром дальше.

Заметим, что для i=800,j=500 , тогда i*j будет больше при сравнении с i=999,j=100 . Просто поймите логику здесь.

Несколько проблем в функции isPalindrome :

  • первый цикл while не подсчитывает количество цифр в числе, но считается меньше.
  • в результате массив numArray слишком мал (предполагая, что ваш компилятор поддерживает создание такого массива)
  • цикл for записывает значение за конец массива, в лучшем случае переписывая другое (возможно важное) место памяти.
  • второй цикл while не имеет должным образом определенного конечного условия – он может с радостью сравнивать значения за границами массива.
  • из-за этого значение в yes потенциально неверно, и поэтому результат функции тоже.
  • вы ничего не возвращаете, если функция не обнаруживает палиндром.
 //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 

Это все, что я мог найти.

Вам также необходимо изменить это

 if(isPalindrome(result) == 0) 

к

 if(isPalindrome(result)) 

Выход кода после внесения изменений: Ссылка

Правильный printf – тот, который был после after, после того, как вы выполните все возможные значения

Вы используете int для хранения значения palidrome, но ваш результат больше 65536, вы должны использовать unsigned

 result = i * j; 

этот код кода неправильный:

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

так должно быть:

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

Как и изменения, которые PR заговорил.

Вы можете сделать что-то подобное, чтобы узнать, является ли число палиндром:

 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; } 

Я преобразовал число в String, чтобы я мог перебирать число в виде массива char:

 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; } 

Я получил правильный ответ на проблему, но я хочу знать, что мой стиль кодирования является хорошим или плохим из моего решения. Мне нужно знать, как я могу улучшить свое кодирование, если оно плохое и более общее.

 #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; } }