找出所有小于n的数字,这些数字在10和2的基础上都是回文的。
例子:
33 is Palindrome in its decimal representation.
100001(binary equivalent of 33) in Binary is a Palindrome.
313 is Palindrome in its decimal representation.
100111001 (binary equivalent of 313) in Binary is a Palindrome.
蛮力:
我们检查从1到n的所有数字,其十进制表示形式是否为回文。
此外,如果数字以10为底回文,那么我们将检查其二进制表示形式。如果我们发现其两种表示形式均为回文,则将其打印出来。
高效方法:
我们从1开始,创建奇数位和偶数位至n的回文,并检查其二进制表示形式是否为回文。
注意:这将减少操作次数,因为我们仅应检查十进制回文,而不是检查从1到n的所有数字。
此方法使用两种方法:
int createPalindrome(int输入,int b,布尔isOdd):
回文创建者输入一个输入数字和一个底数b以及一个布尔值,以指示回文是否应该具有偶数或奇数个数字。它接受输入数字,将其取反并将其附加到输入数字中。如果结果中的位数为奇数,则将反转部分的位数截去。
bool IsPalindrome(int number,int b)
它取输入数字,并根据基数b计算其倒数。无论数字是否等于其反向,都返回结果。
// A C++ program for finding numbers which are
// decimal as well as binary palindrome
#include
using namespace std;
// A utility to check if number is palindrome on base b
bool IsPalindrome(int number, int b)
{
int reversed = 0;
int k = number;
// calculate reverse of number
while (k > 0) {
reversed = b * reversed + k % b;
k /= b;
}
// return true/false depending upon number is palindrome or not
return (number == reversed);
}
// A utility for creating palindrome
int createPalindrome(int input, int b, bool isOdd)
{
int n = input;
int palin = input;
// checks if number of digits is odd or even
// if odd then neglect the last digit of input in finding reverse
// as in case of odd number of digits middle element occur once
if (isOdd)
n /= b;
// creates palindrome by just appending reverse of number to itself
while (n > 0) {
palin = palin * b + (n % b);
n /= b;
}
return palin;
}
// Function to print decimal and binary palindromic number
void findPalindromic(int n)
{
int number;
for (int j = 0; j < 2; j++) {
bool isOdd = (j % 2 == 0);
// Creates palindrome of base 10 upto n
// j always decides digits of created palindrome
int i = 1;
while ((number = createPalindrome(i, 10, isOdd)) < n) {
// if created palindrome of base 10 is
// binary palindrome
if (IsPalindrome(number, 2))
cout << number << " ";
i++;
}
}
}
// Driver Program to test above function
int main()
{
int n = 1000;
findPalindromic(n);
return 0;
}
输出:
1 3 5 7 9 313 585 717 33 99