📜  回文自拍照编号

📅  最后修改于: 2021-06-25 14:33:45             🧑  作者: Mango

给定数字x,则根据自拍照乘法规则找到它是回文自拍编号。如果不存在这样的数字,则打印“不存在这样的数字”。

回文自拍数字满足自拍乘法规则,使得存在另一个x为x * reverse_digits_of(x)= y * reverse_digits_of(y)的数字y,条件是通过对x中的数字进行某种排序来获得数字y,即x和y应该具有相同的数字,但顺序不同。

例子 :

Input : 1224
Output : 2142
Explanation :
Because, 1224 X 4221 = 2142 X 2412
And all digits of 2142 are formed by a different 
permutation of the digits in 1224
(Note: The valid output is either be 2142 or 2412)

Input : 13452
Output : 14532
Explanation :
Because, 13452 X 25431 = 14532 X 23541
And all digits of 14532 are formed by a different 
permutation of the digits in 13452

Input : 12345
Output : No such number exists
Explanation :
Because, with no combination of digits 1, 2, 3, 4, 5 
could we get a number that satisfies 
12345 X 54321 = number X reverse_of_its_digits

方法 :

  • 想法是分解数字并获得数字中所有数字的排列。
  • 然后,将数字及其回文从获得的排列集中删除,这将形成我们相等的LHS。
  • 为了检查RHS,我们现在遍历所有其他等价的排列
    LHS = current_number X palindrome(current_number) 
  • 一旦找到匹配项,我们将以肯定的消息退出循环,否则显示“无此可用数字”。

下面是上述方法的实现:

Java
// Java program to find palindromic selfie numbers
import java.util.*;
  
public class palindrome_selfie {
    // To store all permuations of digits in the number
    Set all_permutes = new HashSet();
  
    int number; // input number
  
    public palindrome_selfie(int num)
    {
        number = num;
    }
  
    // Function to reverse the digits of a number
    public int palindrome(int num)
    {
        int reversednum = 0;
        int d;
        while (num > 0) {
            d = num % 10; // Extract last digit
  
            // Append it at the beg
            reversednum = reversednum * 10 + d;
            num = num / 10;  // Reduce number until 0
        }
  
        return reversednum;
    }
  
    // Function to check palindromic selfie
    public void palin_selfie()
    {
        // Length of the number required for
        // calculating all permuatations of the digits
        int l = String.valueOf(number).length() - 1;
          
        this.permute(number, 0, l); // Calculate all permuations
          
        /* Remove the number and its palindrome from
           the obtained set as this is the LHS of
           multiplicative equality */
        all_permutes.remove(palindrome(number));
        all_permutes.remove(number);
  
        boolean flag = false; // Denotes the status result
  
        // Iterate over all other numbers
        Iterator it = all_permutes.iterator();
        while (it.hasNext()) {
            int number2 = (int)it.next();
  
            // Check for equality x*palin(x) = y*palin(y)
            if (number * palindrome(number) == 
                         number2 * palindrome(number2)) {
                System.out.println("Palindrome multiplicative" + 
                                    "selfie of "+ number + " is  : "
                                     + number2);
  
                flag = true; // Answer found
                break;
            }
        }
  
        // If no such number found
        if (flag == false) {
            System.out.println("Given number has no palindrome selfie.");
        }
    }
  
    // Function to get all possible possible permuations
    // of the digits in num
    public void permute(int num, int l, int r)
    {
        // Adds the new permuation obatined in the set
        if (l == r)
            all_permutes.add(num);
  
        else {
            for (int i = l; i <= r; i++) {
  
                // Swap digits to get a different ordering
                num = swap(num, l, i);
  
                // Recurse to next pair of digits
                permute(num, l + 1, r);
                num = swap(num, l, i); // Swap back
            }
        }
    }
  
    // Function that swaps the digits i and j in the num
    public int swap(int num, int i, int j)
    {
        char temp;
  
        // Convert int to char array
        char[] charArray = String.valueOf(num).toCharArray();
  
        // Swap the ith and jth character
        temp = charArray[i];
        charArray[i] = charArray[j];
        charArray[j] = temp;
  
        // Convert back to int and return
        return Integer.valueOf(String.valueOf(charArray));
    }
  
    // Driver Function
    public static void main(String args[])
    {
        // First example, input = 145572
        palindrome_selfie example1 = new palindrome_selfie(145572);
        example1.palin_selfie();
  
        // Second example, input = 19362
        palindrome_selfie example2 = new palindrome_selfie(19362);
        example2.palin_selfie();
  
        // Third example, input = 4669
        palindrome_selfie example3 = new palindrome_selfie(4669);
        example3.palin_selfie();
    }
}


C#
// C# program to find palindromic selfie numbers
using System;
using System.Collections.Generic;
  
public class palindrome_selfie 
{
    // To store all permuations of digits in the number
    HashSet all_permutes = new HashSet();
  
    int number; // input number
  
    public palindrome_selfie(int num)
    {
        number = num;
    }
  
    // Function to reverse the digits of a number
    public int palindrome(int num)
    {
        int reversednum = 0;
        int d;
        while (num > 0)
        {
            d = num % 10; // Extract last digit
  
            // Append it at the beg
            reversednum = reversednum * 10 + d;
            num = num / 10; // Reduce number until 0
        }
        return reversednum;
    }
  
    // Function to check palindromic selfie
    public void palin_selfie()
    {
        // Length of the number required for
        // calculating all permuatations of the digits
        int l = String.Join("",number).Length - 1;
          
        this.permute(number, 0, l); // Calculate all permuations
          
        /* Remove the number and its palindrome from
        the obtained set as this is the LHS of
        multiplicative equality */
        all_permutes.Remove(palindrome(number));
        all_permutes.Remove(number);
  
        bool flag = false; // Denotes the status result
  
        // Iterate over all other numbers
        foreach (var number2 in all_permutes) 
        {
  
            // Check for equality x*palin(x) = y*palin(y)
            if (number * palindrome(number) == 
                        number2 * palindrome(number2)) 
            {
                Console.WriteLine("Palindrome multiplicative" + 
                                    "selfie of "+ number + " is : "
                                    + number2);
  
                flag = true; // Answer found
                break;
            }
        }
  
        // If no such number found
        if (flag == false) 
        {
            Console.WriteLine("Given number has "+ 
                            "no palindrome selfie.");
        }
    }
  
    // Function to get all possible possible 
    // permuations of the digits in num
    public void permute(int num, int l, int r)
    {
        // Adds the new permuation obatined in the set
        if (l == r)
            all_permutes.Add(num);
  
        else 
        {
            for (int i = l; i <= r; i++)
            {
  
                // Swap digits to get a different ordering
                num = swap(num, l, i);
  
                // Recurse to next pair of digits
                permute(num, l + 1, r);
                num = swap(num, l, i); // Swap back
            }
        }
    }
  
    // Function that swaps the 
    // digits i and j in the num
    public int swap(int num, int i, int j)
    {
        char temp;
  
        // Convert int to char array
        char[] charArray = String.Join("",num).ToCharArray();
  
        // Swap the ith and jth character
        temp = charArray[i];
        charArray[i] = charArray[j];
        charArray[j] = temp;
  
        // Convert back to int and return
        return int.Parse(String.Join("",charArray));
    }
  
    // Driver code
    public static void Main(String []args)
    {
        // First example, input = 145572
        palindrome_selfie example1 = new palindrome_selfie(145572);
        example1.palin_selfie();
  
        // Second example, input = 19362
        palindrome_selfie example2 = new palindrome_selfie(19362);
        example2.palin_selfie();
  
        // Third example, input = 4669
        palindrome_selfie example3 = new palindrome_selfie(4669);
        example3.palin_selfie();
    }
}
  
// This code contributed by Rajput-Ji


输出 :

Palindrome multiplicative selfie of 145572 is  : 157452
Given number has no palindrome selfie.
Palindrome multiplicative selfie of 4669 is  : 6496