回文自拍数


如果一个数字可以使用它自身的数字和某些数学运算来表示,则认为该数字是“自拍数”。

例如,936 是一个自拍数。

$$\mathrm{936\:=\:(\sqrt{9})!^{3} \:+\:6!\:=\:216\:+\:720\:=\:936}$$

在这里可以观察到,对原始数字的数字执行一系列运算,结果等于原始数字。

回文自拍数是一种特殊类型的自拍数。它们满足自拍乘法规则。

  • 考虑一个数字 x。

  • 令由反转 x 的数字形成的数字为 $\mathrm{x^\prime}$。

  • 令 y 为使用 x 的数字以不同顺序形成的数字。

  • 令由反转 y 的数字形成的数字为 $\mathrm{y^\prime}$。

回文自拍数满足以下等式 -

$$\mathrm{x\:×\:x^\prime\:=\:y\:×\:y^\prime}$$

问题陈述

对于给定的数字 x,根据自拍乘法规则找到其回文自拍数。

示例

Input: 1224
Output: 2142

说明 -

给定 x = 1224

所以 $\mathrm{x^\prime}$ = 4221 是通过反转 x 的数字形成的

令 y = 2142。y 是使用 x 的数字以不同顺序形成的

所以 $\mathrm{y^\prime}$ = 2412 是通过反转 y 的数字形成的

$\mathrm{x\:×\:x^\prime}$ =1224 ×4221 = 5166504 和 $\mathrm{y\:×\:y^\prime}$ = 2142 × 2412 = 5166504

由于 x× x' = y × y',所以 y 是 x 的回文自拍数。

Input 4669:
Output: 6496

说明 -

给定 x = 4669

所以 $\mathrm{x^\prime}$ = 9664 是通过反转 x 的数字形成的

令 y = 6496。y 是使用 x 的数字以不同顺序形成的

所以 $\mathrm{y^\prime}$ = 6946 是通过反转 y 的数字形成的

$\mathrm{x\:×\:x^\prime}$ =4669 ×9664 = 45121216 和 $\mathrm{y\:×\:y^\prime}$ = 6496× 6946= 45121216

由于 x× x' = y × y',所以 y 是 x 的回文自拍数。

Input: 456
Output: No palindromic selfie number exists

说明 -

给定 x = 456

所以 $\mathrm{x^\prime}$ = 654 是通过反转 x 的数字形成的

令 y = 546。y 是使用 x 的数字以不同顺序形成的

所以 $\mathrm{y^\prime}$ = 645 是通过反转 y 的数字形成的

$\mathrm{x\:×\:x^\prime}$ =456 ×654 = 298224 和 $\mathrm{y\:×\:y^\prime}$ = 546× 645= 352170

由于 $\mathrm{x\:×\:x^\prime}$ ≠ $\mathrm{y\:×\:y^\prime}$,所以 y 不是 x 的回文自拍数。

456 的其他排列也不满足自拍乘法规则。

解决方案方法

找到给定数字的回文自拍数的解决方案方法非常直观且易于理解。

该方法包括以下步骤 -

  • 定义一个函数“reverse”,该函数

    • 以整数作为输入

    • 将其转换为字符串

    • 反转字符串

    • 将其转换回整数。

  • 定义一个函数“Swap”,该函数

    • 以整数 i 和 j 作为输入

    • 将整数转换为字符串

    • 交换字符串中第 i 个和第 j 个字符

    • 将字符串转换回整数。

  • 定义一个函数“permute”,该函数

    • 以整数 l、r 和集合“permutations”作为输入。

    • 它递归地生成整数的所有可能的数字排列

    • 它将它们存储在集合“permutations”中。

  • 定义一个函数“palindromic_selfie”,该函数

    • 以整数“num”和集合“permutations”作为输入。

    • 它使用“permute”函数生成整数“num”的所有可能的数字排列

    • 然后,它通过将数字及其反转的乘积与排列及其反转的乘积进行比较,检查这些排列中是否有任何一个满足回文自拍属性。

    • 如果找到这样的排列,则返回该数字。否则,返回 -1。

  • 在主函数中,设置一个数字“n”和一个用于存储排列的空集。

  • 使用“n”和空集调用“palindromic_selfie”函数,并存储返回的结果。

  • 如果返回的结果为 -1,则打印“不存在回文自拍数”。否则,打印返回的结果。

示例:C++ 程序

以下 C++ 程序查找给定整数的回文自拍数(如果存在)并返回它。它通过使用 permute() 函数查找给定数字的所有可能的排列,然后使用 reverse() 函数在 palindrome_selfie() 函数中确定给定数字和任何数字排列是否满足回文自拍乘法规则来实现这一点。如果不存在这样的数字,则打印“不存在回文自拍数”。

#include <bits/stdc++.h>
using namespace std;

// Function to reverse the digits of a number
int reverse(int num){
   
   // converting number to string
   string str = to_string(num);
   reverse(str.begin(), str.end());
   
   // converting string to integer
   num = stoi(str);
   return num;
}

// Function that Swaps the digits i and j in the num
int Swap(int num, int i, int j){
   char temp;
   
   // converting number to string
   string s = to_string(num);
   
   // Swap the ith and jth character
   temp = s[i];
   s[i] = s[j];
   s[j] = temp;
   
   // Convert the string back to int and return
   return stoi(s);
}

// Function to get all possible permutations of the digits in num
void permute(int num, int l, int r, set<int> &permutations){
   
   // Adds the new permutation obtained in the set
   if (l == r)
      permutations.insert(num);
   else{
      for (int i = l; i <= r; i++){
         
         // Swap digits to get a different ordering
         int num_copy = Swap(num, l, i);
         
         // Recurse to next pair of digits
         permute(num_copy, l + 1, r, permutations);
      }
   }
}

// Function to check for palindrome selfie number
int palindromic_selfie(int num, set<int>& permutations) {
   
   // Length of the number required for calculating all permutations of the digits
   int l = to_string(num).length() - 1;
   permute(num, 0, l, permutations); // Calculate all permutations
   
   //Remove the number and its reverse from the obtained set as this is the LHS of multiplicative equation
   auto n1 = permutations.find(reverse(num));
   auto n2 = permutations.find(num);
   if (n1 != permutations.end())
      permutations.erase(n1);
   if (n2 != permutations.end())
      permutations.erase(n2);
   
   // Go through all other permutations of the number
   for (set<int>::iterator it = permutations.begin(); it != permutations.end(); it++) {
      int num2 = *it;
      
      // Check if selfie multiplicative rule holds i.e. x * reverse(x) = y * reverse(y)
      if (num * reverse(num) == num2 * reverse(num2)) {
         return num2;
      }
   }
   
   // If no such number found
   return -1;
}
int main(){
   int n = 1234;
   cout << "n: " << n << endl;
   set<int> permutations;
   int ans = palindromic_selfie(n, permutations);
   if (ans == -1) {
      cout << "No Palindromic Selfie Number Exists" << endl;
   }
   else{
      cout << ans << endl;
   }
   return 0;
}

输出

n: 1234
No Palindromic Selfie Number Exists

时间和空间复杂度分析

时间复杂度:O(n!)

此代码的时间复杂度为 O(n!),其中 n 是输入数字的位数。这是因为 n 位数字有 n! 个排列,而 permute() 方法会生成数字的所有可能排列。

空间复杂度:O(n!)

由于集合“permutations”包含数字的所有可能组合,等于 n!,因此此代码的空间复杂度为 O(n!)。reverse() 和 Swap() 函数的空间复杂度为 O(n),因为它们也会生成长度为 n 的临时字符串。包含 O(n!) 空间复杂度的排列集合主导了整个代码的空间复杂度。

结论

回文自拍数是数学中一个有趣的概念。它们满足自拍乘法方程。本文讨论了一种方法来查找一个数字是否具有回文自拍数,如果存在,则返回它。对问题的概念、解决方案方法、C++ 程序以及程序的时间和空间复杂度进行了彻底的分析。

更新于: 2023年4月19日

217 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告