Могу ли я получить отзыв об этой функции `isPalindrome ()` в C? - PullRequest
2 голосов
/ 29 октября 2010

Я пишу несколько полезных функций на C. Одна из них - isPalindrome().

Я решил определить, является ли число палиндромом или нет, я должен ...

  • получение всех цифр в массиве
  • итерация по двум индексам - начиная с 0 и заканчивая счетчиком массива
  • увеличивая / уменьшая индексы при подписке массива, пока они соответствуюти если число массивов становится равным 0, мы имеем палиндром (то есть заканчиваем прохождение всех цифр).

Я придумал ...

int isPalindrome(int num) {

    int places[100];
    int i = 0;
    while (num > 0) {
        places[i++] = num % 10; 
        num /= 10;
    }

    int j = 0;
    while (i >= 0 && places[j++] == places[--i]) {
    }
    return i == -1;

}

Это вообще каксделано?

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

Итак, какие-либо улучшения или предложения по моему коду?

Большое спасибо!

Ответы [ 4 ]

5 голосов
/ 29 октября 2010

Вы должны только зацикливаться, пока i > j.Однажды i <= j, вы просто проверяете все символы во второй раз.

2 голосов
/ 29 октября 2010

Хотя использование встроенных ++ и -- операторов в следующих может показаться умным:

while (i >= 0 && places[j++] == places[--i]) { 
} 

ваш код будет легче читать, если вы поместите эти в циклbody:

while (i >= 0 && places[j] == places[i-1]) { 
    j++;
    i--;
} 

Таким образом, читателю кода не придется думать о возможных побочных эффектах изменения значений i и j в условном тесте.Вероятно, не будет ощутимого влияния на скорость скомпилированного кода (хотя, если производительность важна для этой функции, вы должны проверить это с вашим компилятором).

Также у вас есть ошибка, из-за которойдоступ places[-1], если i == 0.

1 голос
/ 29 октября 2010

В Яве

static boolean isPalindrome(String p) {
    return p.equals(new StringBuilder(p).reverse().toString());
}

В с ++ и с

int IsPalindrome(char *string) {
    int bottom = 0, top;

    top = strlen(string) - 1;
    while(bottom < top && string[bottom] == string[top]) {
        ++bottom;
        --top;
    }
    return (bottom >= top ? 1:0);
}

Примечание. Вам нужно написать функцию itoa , если вам нужно сделать это для ввода числа. Или используйте ( ссылка ).

Вот как это обычно делается. Это также будет работать для всех баз, а не только для 10.

1 голос
/ 29 октября 2010

Я бы просто использовал sprintf для "преобразования строки в цифры":

char places[100];
sprintf(places, "%i", num);
i = strlen(places);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...