Палиндромная целочисленная проверка

Одним из наших заданий при работе с C ++ в программировании 1-го года было написать функцию, которая может проверять, является ли число палиндромным или нет (например, 16461). Я бы загрузил свой код, но я даже не знаю, с чего начать, когда дело доходит до извлечения цифр из целого числа или проверки количества цифр в целом числе. Любая помощь или советы будут оценены!

0

Решение

Есть много способов решить эту проблему. Мне больше всего нравится решение, которое создает число зеркал и проверяет, является ли оно идентичным оригинальному (хотя, возможно, это не самый эффективный способ). Код должен быть примерно таким:

bool isPalindrom(int n) {
int original = n;
int mirror = 0;
while (n) {
mirror = mirror * 10 + n % 10;
n /= 10;
}
return mirror == original;
}
2

Другие решения

Вы можете использовать арифметику по модулю (оператор%), чтобы извлечь отдельные цифры. Альтернативой было бы получить строковое представление вашего номера и работать с ним.

0

подсказки:

  • «Количество цифр» очень сложно определить, так как вы всегда можете добавить 0 слева и при этом иметь одинаковое число. Внимательно прочитайте и подумайте, как вы хотите это определить.
  • Цифры целого числа связаны со степенями 10 (напомним, 123 = 1*100 + 2*10 + 3*1), поэтому для извлечения цифр необходимо извлечь степени 10. Ключевыми операциями являются остаток и усеченное деление. Что произойдет, если вы делаете (123 % 10)? Как насчет (123 / 10)? Как насчет ((123 / 10) % 10)?
0

Лучше всего сначала преобразовать целое число в строку. Тестирование строки, если это палиндром, намного проще.

#include <sstream>
#include <iostream>
#include <string>

bool isPalindrome(int value)
{
// convert integer into text
std::ostringstream oss;
oss << value;
std::string valueText = oss.str();
if (valueText.size()%2==0) {
return false;
}
for (int i = 0; i < (valueText.size()/2); ++i) {
if (valueText[i]!=valueText[valueText.size()-i-1]) {
return false;
}
}
return true;
}

int main()
{
for (int i = 0; i < 100000; ++i) {
if (isPalindrome(i)) {
std::cout << i << std::endl;
}
}

return 0;
}

Сначала преобразуйте целое число в std::string:

    std::ostringstream oss;
oss << value;
std::string valueText = oss.str();

Теперь проверьте, имеет ли строка нечетное число цифр:

    if (valueText.size()%2==0) {
return false;
}

Если строка имеет нечетное количество цифр, проверьте, совпадают ли эти цифры:

    for (int i = 0; i < (valueText.size()/2); ++i) {
if (valueText[i]!=valueText[valueText.size()-i-1]) {
return false;
}
}
0

Вот решение, которое преобразует целое число в строку в стиле C и идет оттуда.

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

bool isPalindrome(int n) {
char s[256];
sprintf(s, "%d", n);

char *p = s, *q = &s[strlen(s) - 1];
while (*p == *q && p++ < q--)
;

return (p == q) || (*p == *q);
}

int main() {
int n = 1644451;
cout << isPalindrome(n) << endl;

return 0;
}
0

Если производительность не является проблемой, и если вы можете сделать c ++ 11, легко читаемое решение:

template<class T>
bool isPalindrome(T i)
{
auto s = std::to_string(i);
auto s2 = s;
std::reverse(s.begin(), s.end());
return s == s2;
}

что, конечно, намного медленнее, чем ручное прохождение цифр, но imho очень читабельно …

позвоните с помощью:

std::cout << isPalindrome<int>(12321);
std::cout << isPalindrome<int>(1232);
0
По вопросам рекламы [email protected]