回文测试功能

Palindrome testing function

本文关键字:功能 测试 回文      更新时间:2023-10-16

这个函数似乎适用于奇数位数的数字,但不适用于每个偶数的数字(例如,它为 2662 返回 true,但对 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 作为字符串进行比较会更容易 == 反向字符串:

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