如何查找整数是否为回文?

时间:2019-03-29 14:35:03

标签: c++

我必须在整数域中这样做,不能使用字符串。

我采用以下方法:

bool isPalindrome(int x) {
        //Fails for 1000021
        if(x < 0)
            return false;
        int count  = 0, temp = x;
        while(temp/=10) count++;
        unsigned long long exp = pow(10, count);
        //std::cout<<exp<<"\n";
        while(x > 0 ){
            int front = x / exp;
            int back = x % 10;
            if(front!=back)
                return false;
            //std::cout<<"x : "<<x<<"\n";
            x %= exp;
            exp /= 100;
            //std::cout<<"x : "<<x<<"\n";
            x /= 10;
            //std::cout<<"x : "<<x<<"\n";
        }
        return true;
    }

我将成对的前尾数字相匹配,同时从前和后砍掉整数。它失败了1000021。在第二次迭代中,x最终为0,因此返回true。

是否可以使用当前方法处理这种情况?

EDIT1:稍微修复了代码。每次迭代exp / = 100,因为每次迭代都没有两位数。

EDIT2:固定代码。 x%= exp; ,之前是x / = exp;基本上是删除了第一个数字右边的所有内容,这不是我想要的。

3 个答案:

答案 0 :(得分:4)

另一种方法:将每个数字加到int向量上,然后复制该向量并将其反转(如果向量相等,则数字为“回文”)。

bool isPalindrome(int x)
{
    std::vector<int> v;
    while(x > 0)
    {
        int r = x % 10;
        v.push_back(r);
        x -= r;
        x /= 10;
    }

    std::vector<int> c(v);
    std::reverse(c.begin(), c.end());

    return (c==v);
}

答案 1 :(得分:2)

unsigned decReversed(unsigned x) {
    unsigned r = 0;
    while (x) {
        r = r * 10 + x % 10;
        x /= 10;
    }
    return r;
}

bool isDecPalindrome(unsigned x)
{
    return x == decReversed(x);
}

答案 2 :(得分:0)

这似乎是一个leetcode问题。计算倒数是解决此问题的最有效方法。以下是使用Catch2

的解决方案,简单分析和测试
#define CATCH_CONFIG_MAIN
#include "catch2/catch.hpp"

/**
 * Problem: https://leetcode.com/problems/palindrome-number
 *
 * Runtime: O(K), where K is the number of digits
 * Memory: O(1)
 */
class Solution {
  public:
    bool isPalindrome(int x) {
        constexpr int TEN = 10;
        if (x < 0) return false;
        long tmp = x;
        long reversed_number = 0;      // Cast to long to avoid overflow.
        while (tmp > 0) {
            reversed_number = reversed_number * TEN + (tmp % TEN);
            tmp /= TEN;
        }
        return reversed_number == x;
    }
};

TEST_CASE("Basic tests") {
    Solution sol;
    SECTION("Case 1") { CHECK(!sol.isPalindrome(123)); }
    SECTION("Case 2") { CHECK(!sol.isPalindrome(-121)); }
    SECTION("Case 3") { CHECK(!sol.isPalindrome(2147483647)); }
    SECTION("Case 4") { CHECK(sol.isPalindrome(0)); }
    SECTION("Case 5") { CHECK(sol.isPalindrome(121)); }
    SECTION("Case 6") { CHECK(sol.isPalindrome(33)); }
}