Ordenar una array en orden creciente de su persistencia multiplicativa

Dada una array arr[] que consta de N enteros positivos, la tarea es clasificar la array en orden creciente con respecto al número de pasos necesarios para obtener un número de un solo dígito multiplicando sus dígitos recursivamente para cada elemento de la array. Si dos números cualesquiera tienen el mismo número de pasos, imprima primero el número más pequeño.

Ejemplos :

Entrada: arr[] = {39, 999, 4, 9876} 
Salida: 4 9876 39 999 
Explicación:
Los siguientes son el número de pasos necesarios para reducir cada elemento de la array a 0:

  • Para arr[0] (= 39): El elemento 39 se reducirá como 39 → 27 → 14 → 4. Por lo tanto, el número de pasos necesarios es 3.
  • Para arr[1] (= 999): El elemento 999 se reducirá como 999 → 729 → 126 → 12 → 2. Por lo tanto, el número de pasos necesarios es 4.
  • Para arr[2] (= 4): El elemento 4 ya es un número de un solo dígito. Por lo tanto, el número de pasos necesarios es 0.
  • Para arr[3] (= 9876): El elemento 9876 se reducirá como 9876 → 3024 → 0. Por lo tanto, el número de pasos necesarios es 2.

De acuerdo con los criterios dados, los elementos en orden creciente de recuento de pasos necesarios para reducirlos a un número de un solo dígito son {4, 9876, 29, 999}

Entrada: arr[] = {1, 27, 90} 
Salida: 1 90 27 

Enfoque: El problema dado puede resolverse encontrando el número de pasos necesarios para obtener un número de un solo dígito multiplicando sus dígitos recursivamente para cada elemento de la array y luego ordenando la array en orden creciente usando la función de comparación . Siga los pasos para resolver el problema:

  • Declare una función de comparación, cmp(X, Y) que tome dos elementos como parámetro y realice los siguientes pasos:
    • Itere un ciclo hasta que X se convierta en un número de un solo dígito y actualice el valor de X al producto de su dígito.
    • Repita el paso anterior para el valor Y .
    • Si el valor de X es menor que Y , devuelve true . De lo contrario, devuelve falso .
  • Ordene la array dada arr[] usando la función de comparación anterior como sort(arr, arr + N, cmp) .
  • Después de completar los pasos anteriores, imprima la array arr[] .

A continuación se muestra la implementación del enfoque anterior:

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

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>
Producción: 

4 9876 39 999

 

Complejidad de tiempo: O(N * log(N) * log(X)), donde X es el elemento más grande de la array , arr[]
Espacio auxiliar: O(1), ya que no se ha tomado espacio extra.

Publicación traducida automáticamente

Artículo escrito por spp____ y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *