Open In App

Sort an array in increasing order of their Multiplicative Persistence

Last Updated : 20 Jan, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array arr[] consisting of N positive integers, the task is to sort the array in increasing order with respect to the count of steps required to obtain a single-digit number by multiplying its digits recursively for each array element. If any two numbers have the same count of steps, then print the smaller number first.

Examples:

Input: arr[] = {39, 999, 4, 9876} 
Output: 4 9876 39 999 
Explanation:
Following are the number of steps required to reduce every array element to 0:

  • For arr[0] (= 39): The element 39 will reduce as 39 ? 27 ? 14 ? 4. Therefore, the number of steps required is 3.
  • For arr[1] (= 999): The element 999 will reduce as 999 ? 729 ? 126 ? 12 ? 2. Therefore, the number of steps required is 4.
  • For arr[2] (= 4): The element 4 is already a single-digit number. Therefore, the number of steps required is 0.
  • For arr[3] (= 9876): The element 9876 will reduce as 9876 ? 3024 ? 0. Therefore, the number of steps required is 2.

According to the given criteria the elements in increasing order of count of steps required to reduce them into single-digit number is {4, 9876, 29, 999}

Input: arr[] = {1, 27, 90} 
Output: 1 90 27 

Approach: The given problem can be solved by finding the count of steps required to obtain a single-digit number by multiplying its digits recursively for each array element and then sort the array in increasing order using the comparator function. Follow the steps to solve the problem:

  • Declare a comparator function, cmp(X, Y) that takes two elements as a parameter and perform the following steps:
    • Iterate a loop until X becomes a single-digit number and update the value of X to the product of its digit.
    • Repeat the above step for the value Y.
    • If the value of X is less than Y, then return true. Otherwise, return false.
  • Sort the given array arr[] by using the above comparator function as sort(arr, arr + N, cmp).
  • After completing the above steps, print the array arr[].

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the number of
// steps required to reduce a given
// number to a single-digit number
int countReduction(int num)
{
    // Stores the required result
    int ans = 0;
 
    // Iterate until a single digit
    // number is not obtained
    while (num >= 10) {
 
        // Store the number in a
        // temporary variable
        int temp = num;
        num = 1;
 
        // Iterate over all digits and
        // store their product in num
        while (temp > 0) {
            int digit = temp % 10;
            temp = temp / 10;
            num *= digit;
        }
 
        // Increment the answer
        // by 1
        ans++;
    }
 
    // Return the result
    return ans;
}
 
// Comparator function to sort the array
bool compare(int x, int y)
{
    // Count number of steps required
    // to reduce X and Y into single
    // digits integer
    int x1 = countReduction(x);
    int y1 = countReduction(y);
 
    // Return true
    if (x1 < y1)
        return true;
 
    return false;
}
 
// Function to sort the array according
// to the number of steps required to
// reduce a given number into a single
// digit number
void sortArray(int a[], int n)
{
    // Sort the array using the
    // comparator function
    sort(a, a + n, compare);
 
    // Print the array after sorting
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
}
 
// Driver Code
int main()
{
    int arr[] = { 39, 999, 4, 9876 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    sortArray(arr, N);
 
    return 0;
}


Java




// Java program for the above approach
import java.util.*;
import java.lang.*;
class GFG
{
 
// Function to find the number of
// steps required to reduce a given
// number to a single-digit number
static int countReduction(int num)
{
   
    // Stores the required result
    int ans = 0;
 
    // Iterate until a single digit
    // number is not obtained
    while (num >= 10)
    {
 
        // Store the number in a
        // temporary variable
        int temp = num;
        num = 1;
 
        // Iterate over all digits and
        // store their product in num
        while (temp > 0) {
            int digit = temp % 10;
            temp = temp / 10;
            num *= digit;
        }
 
        // Increment the answer
        // by 1
        ans++;
    }
 
    // Return the result
    return ans;
}
 
// Function to sort the array according
// to the number of steps required to
// reduce a given number into a single
// digit number
static void sortArray(Integer a[], int n)
{
   
    // Sort the array using the
    // comparator function
    Arrays.sort(a,new Comparator<Integer>(){
        public int compare(Integer x, Integer y)
   {
           
            // Count number of steps required
    // to reduce X and Y into single
    // digits integer
    int x1 = countReduction(x);
    int y1 = countReduction(y);
 
    // Return true
    if (x1 < y1)
        return -1;
 
    return 1;
        }
    });
 
    // Print the array after sorting
    for (int i = 0; i < n; i++)
    {
        System.out.print(a[i] + " ");
    }
}
 
  // Driver code
public static void main (String[] args)
{
     Integer arr[] = { 39, 999, 4, 9876 };
    int N = arr.length;
 
    // Function Call
    sortArray(arr, N);
}
}
 
// This code is contributed by offbeat


Python3




import functools
 
def CountReduction(num):
    # Stores the required result
    ans = 0
 
    # Iterate until a single digit
    # number is not obtained
    while num >= 10:
        # Store the number in a
        # temporary variable
        temp = num
        num = 1
 
        # Iterate over all digits and
        # store their product in num
        while temp > 0:
            digit = temp % 10
            temp = temp // 10
            num *= digit
 
        # Increment the answer
        # by 1
        ans += 1
 
    # Return the result
    return ans
 
def SortArray(a):
    # Sort the array using the
    # comparator function
    a.sort(key=CountReduction)
 
    # Print the array after sorting
    print(a)
 
arr = [39, 999, 4, 9876]
 
# Function Call
SortArray(arr)
 
# This code is provided by mukul ojha


C#




using System;
using System.Linq;
 
class Program
{
  // Function to find the number of
  // steps required to reduce a given
  // number to a single-digit number
  static int CountReduction(int num)
  {
    // Stores the required result
    int ans = 0;
 
    // Iterate until a single digit
    // number is not obtained
    while (num >= 10)
    {
      // Store the number in a
      // temporary variable
      int temp = num;
      num = 1;
 
      // Iterate over all digits and
      // store their product in num
      while (temp > 0)
      {
        int digit = temp % 10;
        temp = temp / 10;
        num *= digit;
      }
 
      // Increment the answer
      // by 1
      ans++;
    }
 
    // Return the result
    return ans;
  }
 
  // Function to sort the array according
  // to the number of steps required to
  // reduce a given number into a single
  // digit number
  static void SortArray(int[] a, int n)
  {
    // Sort the array using the
    // comparator function
    Array.Sort(a, (x, y) =>
               {
                 // Count number of steps required
                 // to reduce X and Y into single
                 // digits integer
                 int x1 = CountReduction(x);
                 int y1 = CountReduction(y);
 
                 // Return true
                 if (x1 < y1)
                   return -1;
 
                 return 1;
               });
 
    // Print the array after sorting
    Console.WriteLine(string.Join(" ", a.Select(x => x.ToString())));
  }
 
  static void Main(string[] args)
  {
    int[] arr = { 39, 999, 4, 9876 };
    int N = arr.Length;
 
    // Function Call
    SortArray(arr, N);
  }
}
 
// This code is contributed by aadityaburujwale.


Javascript




<script>
 
// JavaScript program for the above approach
 
 
// Function to find the number of
// steps required to reduce a given
// number to a single-digit number
function countReduction(num) {
    // Stores the required result
    let ans = 0;
 
    // Iterate until a single digit
    // number is not obtained
    while (num >= 10) {
 
        // Store the number in a
        // temporary variable
        let temp = num;
        num = 1;
 
        // Iterate over all digits and
        // store their product in num
        while (temp > 0) {
            let digit = temp % 10;
            temp = Math.floor(temp / 10);
            num *= digit;
        }
 
        // Increment the answer
        // by 1
        ans++;
    }
 
    // Return the result
    return ans;
}
 
// Comparator function to sort the array
function compare(x, y) {
    // Count number of steps required
    // to reduce X and Y into single
    // digits integer
    let x1 = countReduction(x);
    let y1 = countReduction(y);
 
    // Return true
    if (x1 < y1)
        return -1;
 
    return 1;
}
 
// Function to sort the array according
// to the number of steps required to
// reduce a given number into a single
// digit number
function sortArray(a, n) {
    // Sort the array using the
    // comparator function
    a.sort(compare);
 
    // Print the array after sorting
    for (let i = 0; i < n; i++) {
        document.write(a[i] + " ");
    }
}
 
// Driver Code
 
let arr = [39, 999, 4, 9876];
let N = arr.length;
 
// Function Call
sortArray(arr, N);
 
</script>


Output: 

4 9876 39 999

 

Time Complexity: O(N * log(N) * log(X)), where X is the largest element in the array, arr[]
Auxiliary Space: O(1),  since no extra space has been taken.



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads