回文测试函数

Palindrome testing function

此函数似乎适用于奇数位数的数字,但不适用于所有偶数位数的数字(例如,returns 2662 为真,906609 则不然)。在过去的 20-30 分钟里,我一直在努力解决这个问题,但我还没有找到原因。

#include <math.h>

int digits(int n)
{
    return log10(n)+1;
}

bool ispalindrome(int n)
{
    int c=digits(n);
        for(int i=0; i<c/2; i++){
            int a=pow(10,i),b=pow(10,c-i-1);
            if(  int(n/a) %10 != int(n/b) %10 ) return false;
        }
        return true;
}

#include <iostream>
#include <cstdlib>
int main(int, char**argv)
{
    while (*++argv)
        std::cout << *argv
                  << (ispalindrome(std::atoi(*argv)) ? " is a palindrome." : " is not a palindrome.")
                  << std::endl;
}

我无法重现,但我认为将 int 与字符串进行比较会更容易 == reversedString:

bool isPalindrome(const int& n)
{
   std::stringstream ssN;
   ssN << n;
   auto numberAsString = ssN.str();
   auto reversed = numberAsString;
   std::reverse(numberAsString.begin(), numberAsString.end());
   return numberAsString == reversed;
}

请检查代码:main.cpp

我无法重现你的结果 - 我得到了你的两个测试用例的预期答案。

顺便说一句,您可以通过简单地反转数字然后与原始数字进行比较来避免 <math.h> 的需要:

bool ispalindrome(int n)
{
    int a = 0;

    for (int r = n;  r;  r /= 10)
        a = a*10 + r%10;

    return a == n;
}