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

📅  最后修改于: 2021-04-26 07:00:32             🧑  作者: Mango

找出所有小于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