Given a number x, find it’s palindromic selfie number according to selfie multiplicative rule. If such a number doesn’t exist, then print “No such number exists”.
A Palindromic selfie number satisfies the selfie multiplicative rule such that there exists another number y with x * reverse_digits_of(x) = y * reverse_digits_of(y), with the condition that the number y is obtained by some ordering of the digits in x, i.e x and y should have same digits with different order.
Examples :
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
Approach :
- The idea is to break down the number and obtain all permutations of the digits in the number.
- Then, the number and its palindrome are removed from the set of permutations obtained, which will form the LHS of our equality.
- To check for RHS, we now iterate over all other permutations equating
LHS = current_number X palindrome(current_number)
- As soon as we get a match, we exit the loop with an affirmative message, else print “No such number available”.
Below is implementation of above approach :
// C++ program to find palindromic selfie numbers #include <bits/stdc++.h> using namespace std;
class palindrome_selfie {
public :
// To store all permutations of digits in the number
set< int > all_permutes;
int number; // input number
palindrome_selfie( int num) { number = num; }
// Function to reverse the digits of a number
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 that swaps the digits i and j in the num
int swap( int num, int i, int j)
{
char temp;
string charArray = to_string(num);
// Swap the ith and jth character
temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
// Convert back to int and return
return stoi(charArray);
}
// Function to get all possible permutations
// of the digits in num
void permute( int num, int l, int r)
{
// Adds the new permutation obtained in the set
if (l == r)
all_permutes.insert(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 to check palindromic selfie
void palin_selfie()
{
// Length of the number required for
// calculating all permutations of the digits
int l = to_string(number).length() - 1;
permute(number, 0, l); // Calculate all permutations
/* Remove the number and its palindrome from
the obtained set as this is the LHS of
multiplicative equality */
auto n1 = all_permutes.find(palindrome(number));
auto n2 = all_permutes.find(number);
all_permutes.erase(n1);
all_permutes.erase(n2);
bool flag = false ; // Denotes the status result
// Iterate over all other numbers
for ( auto it : all_permutes) {
int number2 = it;
// Check for equality x*palin(x) = y*palin(y)
if (number * palindrome(number)
== number2 * palindrome(number2)) {
cout << "Palindrome multiplicative"
<< "selfie of " << number
<< " is : " << number2 << endl;
flag = true ; // Answer found
break ;
}
}
// If no such number found
if (flag == false ) {
cout << "Given number has no palindrome selfie."
<< endl;
}
}
}; // Driver Function int main()
{ // First example, input = 145572
palindrome_selfie example1(145572);
example1.palin_selfie();
// Second example, input = 19362
palindrome_selfie example2(19362);
example2.palin_selfie();
// Third example, input = 4669
palindrome_selfie example3(4669);
example3.palin_selfie();
return 0;
} // This code is contributed by phasing17 |
// Java program to find palindromic selfie numbers import java.util.*;
public class palindrome_selfie {
// To store all permutations of digits in the number
Set<Integer> all_permutes = new HashSet<Integer>();
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 permutations of the digits
int l = String.valueOf(number).length() - 1 ;
this .permute(number, 0 , l); // Calculate all permutations
/* 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 permutations
// of the digits in num
public void permute( int num, int l, int r)
{
// Adds the new permutation obtained 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();
}
} |
# Python3 program to find palindromic selfie numbers # To store all permutations of digits in the number class palindrome_selfie:
def __init__( self , num):
self .all_permutes = set ();
self .number = num; # input number
# Function to reverse the digits of a number
def palindrome( self , num):
reversednum = 0 ;
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 that swaps the digits i and j in the num
def swap( self , num, i, j):
charArray = list ( str (num))
# Swap the ith and jth character
temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
# Convert back to int and return
return int ("".join(charArray))
# Function to get all possible permutations
# of the digits in num
def permute( self , num, l, r):
# Adds the new permutation obtained in the set
if (l = = r):
self .all_permutes.add(num);
else :
for i in range (l, r + 1 ):
# Swap digits to get a different ordering
num = self .swap(num, l, i);
# Recurse to next pair of digits
self .permute(num, l + 1 , r);
num = self .swap(num, l, i); # Swap back
# Function to check palindromic selfie
def palin_selfie( self ):
# Length of the number required for
# calculating all permutations of the digits
l = len ( str ( self .number)) - 1
self .permute( self .number, 0 , l); # Calculate all permutations
# Remove the number and its palindrome from
# the obtained set as this is the LHS of
# multiplicative equality */
self .all_permutes.remove( self .palindrome( self .number));
self .all_permutes.remove( self .number);
flag = False ; # Denotes the status result
# Iterate over all other numbers
for it in self .all_permutes:
number2 = it;
# Check for equality x*palin(x) = y*palin(y)
if ( self .number * self .palindrome( self .number) = = number2 * self .palindrome(number2)):
print ( "Palindrome multiplicative selfie of" , self .number, "is :" , number2);
flag = True ; # Answer found
break ;
# If no such number found
if (flag = = False ):
print ( "Given number has no palindrome selfie." );
# Driver Function # First example, input = 19362 n2 = palindrome_selfie( 19362 );
n2.palin_selfie(); # Second example, input = 4669 n3 = palindrome_selfie( 4669 );
n3.palin_selfie(); # This code is contributed by phasing17 |
// C# program to find palindromic selfie numbers using System;
using System.Collections.Generic;
public class palindrome_selfie
{ // To store all permutations of digits in the number
HashSet< int > all_permutes = new HashSet< int >();
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 permutations of the digits
int l = String.Join( "" ,number).Length - 1;
this .permute(number, 0, l); // Calculate all permutations
/* 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
// permutations of the digits in num
public void permute( int num, int l, int r)
{
// Adds the new permutation obtained 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 |
// JavaScript program to find palindromic selfie numbers // To store all permutations of digits in the number let all_permutes; let number; function init(num)
{ all_permutes = new Set();
number = num; // input number
} // Function to reverse the digits of a number function palindrome(num)
{ let reversednum = 0;
let d;
while (num > 0) {
d = num % 10; // Extract last digit
// Append it at the beg
reversednum = reversednum * 10 + d;
num = Math.floor(num / 10); // Reduce number until 0
}
return reversednum;
} // Function that swaps the digits i and j in the num function swap(num, i, j)
{ let temp;
let charArray = (num.toString()).split( "" );
// Swap the ith and jth character
temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
// Convert back to int and return
return parseInt(charArray.join( "" ));
} // Function to get all possible permutations // of the digits in num function permute(num, l, r)
{ // Adds the new permutation obtained in the set
if (l == r)
all_permutes.add(num);
else {
for ( var 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 to check palindromic selfie function palin_selfie()
{ // Length of the number required for
// calculating all permutations of the digits
var l = (number.toString()).length - 1;
permute(number, 0, l); // Calculate all permutations
/* Remove the number and its palindrome from
the obtained set as this is the LHS of
multiplicative equality */
all_permutes. delete (palindrome(number));
all_permutes. delete (number);
let flag = false ; // Denotes the status result
// Iterate over all other numbers
for ( var it of all_permutes) {
let number2 = it;
// Check for equality x*palin(x) = y*palin(y)
if (number * palindrome(number)
== number2 * palindrome(number2)) {
console.log(
"Palindrome multiplicative selfie of "
+ number + " is : " + number2);
flag = true ; // Answer found
break ;
}
}
// If no such number found
if (flag == false ) {
console.log(
"Given number has no palindrome selfie." );
}
} // Driver Function // First example, input = 145572 init(145572); palin_selfie(); // Second example, input = 19362 init(19362); palin_selfie(); // Third example, input = 4669 init(4669); palin_selfie(); // This code is contributed by phasing17 |
Output :
Palindrome multiplicative selfie of 145572 is : 157452 Given number has no palindrome selfie. Palindrome multiplicative selfie of 4669 is : 6496
Time complexity: O(n*n!) where n is the number of digits in the input number.
Auxiliary Space: O(n!)