Одним из наших заданий при работе с C ++ в программировании 1-го года было написать функцию, которая может проверять, является ли число палиндромным или нет (например, 16461). Я бы загрузил свой код, но я даже не знаю, с чего начать, когда дело доходит до извлечения цифр из целого числа или проверки количества цифр в целом числе. Любая помощь или советы будут оценены!
Есть много способов решить эту проблему. Мне больше всего нравится решение, которое создает число зеркал и проверяет, является ли оно идентичным оригинальному (хотя, возможно, это не самый эффективный способ). Код должен быть примерно таким:
bool isPalindrom(int n) {
int original = n;
int mirror = 0;
while (n) {
mirror = mirror * 10 + n % 10;
n /= 10;
}
return mirror == original;
}
Вы можете использовать арифметику по модулю (оператор%), чтобы извлечь отдельные цифры. Альтернативой было бы получить строковое представление вашего номера и работать с ним.
подсказки:
123 = 1*100 + 2*10 + 3*1
), поэтому для извлечения цифр необходимо извлечь степени 10. Ключевыми операциями являются остаток и усеченное деление. Что произойдет, если вы делаете (123 % 10)
? Как насчет (123 / 10)
? Как насчет ((123 / 10) % 10)
?Лучше всего сначала преобразовать целое число в строку. Тестирование строки, если это палиндром, намного проще.
#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;
}
}
Вот решение, которое преобразует целое число в строку в стиле 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;
}
Если производительность не является проблемой, и если вы можете сделать 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);