📌  相关文章
📜  C++程序查找所有小于n的数字,这些数字在10和2的基础上是回文的。(1)

📅  最后修改于: 2023-12-03 15:29:55.478000             🧑  作者: Mango

C++程序:查找小于n的回文数字

这是一个C++程序,用于查找所有小于n的数字,并返回所有在10进制和2进制下都是回文的数字。

算法原理

我们需要两个函数来实现这个算法。第一个是isPalindrome函数,用于判断一个数字是否是回文的。第二个是countPalindromicNumbers函数,用于循环遍历数字并计算回文数字的数量。

isPalindrome函数

该函数将一个数字传递给它,并返回一个布尔值指示该数字是否是回文的。它使用两个指针,一个在数字的最左边,一个在最右边。当两个指针指向的数字相等时,它们会向中间移动。如果它们都停止,则该数字是回文的。

bool isPalindrome(unsigned int n) {
    string s = to_string(n);
    string::iterator itLeft = s.begin();
    string::iterator itRight = s.end() - 1;
    bool isPal = true;

    while (itLeft < itRight) {
        if (*itLeft != *itRight) {
            isPal = false;
            break;
        }
        ++itLeft;
        --itRight;
    }

    return isPal;
}
countPalindromicNumbers函数

该函数遍历i从1到n的每个数字。它使用isPalindrome函数检查数字是否为回文,并使用bitset库检查数字在二进制下是否回文。如果数字在十进制和二进制下都是回文的,则将其添加到结果向量中。

vector<unsigned int> countPalindromicNumbers(unsigned int n) {
    vector<unsigned int> result;
    unsigned int i = 1;

    while (i < n) {
        if (isPalindrome(i) && bitset<32>(i).to_string() == bitset<32>(i).to_string().substr(numeric_limits<unsigned int>::digits - log2(i) - 1, numeric_limits<unsigned int>::digits)) {
            result.push_back(i);
        }
        ++i;
    }

    return result;
}
使用示例

以下是使用示例:

int main() {
    vector<unsigned int> palindromicNumbers = countPalindromicNumbers(1000);
    for (auto i : palindromicNumbers) {
        cout << i << endl;
    }
    return 0;
}

该代码将输出小于1000的所有回文数字。

结论

这是一个简单的C++程序,用于查找小于n的回文数字。它使用两个函数实现算法,每个函数都具有自己的用途,并且用于检查数字是否回文,并计算回文数字的数量。