📅  最后修改于: 2023-12-03 15:29:55.478000             🧑  作者: Mango
这是一个C++程序,用于查找所有小于n的数字,并返回所有在10进制和2进制下都是回文的数字。
我们需要两个函数来实现这个算法。第一个是isPalindrome
函数,用于判断一个数字是否是回文的。第二个是countPalindromicNumbers
函数,用于循环遍历数字并计算回文数字的数量。
该函数将一个数字传递给它,并返回一个布尔值指示该数字是否是回文的。它使用两个指针,一个在数字的最左边,一个在最右边。当两个指针指向的数字相等时,它们会向中间移动。如果它们都停止,则该数字是回文的。
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;
}
该函数遍历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的回文数字。它使用两个函数实现算法,每个函数都具有自己的用途,并且用于检查数字是否回文,并计算回文数字的数量。