Decrementos mínimos o división por un divisor propio requerido para reducir N a 1

Dado un entero positivo N , la tarea es encontrar el número mínimo de operaciones requeridas para reducir N a 1 dividiendo repetidamente N entre sus divisores propios o disminuyendo N en 1 .

Ejemplos:

Entrada: N = 9
Salida: 3
Explicación:
Los divisores propios de N(= 9) son {1, 3}. Se realizan las siguientes operaciones para reducir N a 1:
Operación 1: Dividir N(= 9) entre 3 (que es un divisor propio de N(= 9) modifica el valor de N a 9/3 = 1.
Operación 2: Decrementar el el valor de N(= 3) en 1 modifica el valor de N a 3 – 1 = 2.
Operación 3: Decrementar el valor de N(= 2) en 1 modifica el valor de N a 2 – 1 = 1.
Por lo tanto, el el número total de operaciones requeridas es 3.

Entrada: N = 4
Salida: 2

Enfoque: El problema dado se puede resolver con base en las siguientes observaciones:

  • Si el valor de N es par, entonces se puede reducir al valor 2 dividiendo N por N / 2 seguido de una disminución de 2 a 1 . Por lo tanto, el número mínimo de pasos necesarios es 2 .
  • De lo contrario, el valor de N se puede igualar al disminuirlo y se puede reducir a 1 usando los pasos anteriores.

Siga los pasos que se indican a continuación para resolver el problema.

  • Inicialice una variable, digamos cnt como 0 , para almacenar el número mínimo de pasos necesarios para reducir N a 1 .
  • Itere un ciclo hasta que N se reduzca a 1 y realice los siguientes pasos:
    • Si el valor de N es igual a 2 o N es impar , actualice el valor de N = N – 1 e incremente cnt en 1 .
    • De lo contrario, actualice el valor de N = N / (N / 2) e incremente cnt en 1.
  • Después de completar los pasos anteriores, imprima el valor de cnt como resultado.

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 minimum number
// of steps required to reduce N to 1
int reduceToOne(long long int N)
{
    // Stores the number
    // of steps required
    int cnt = 0;
 
    while (N != 1) {
 
        // If the value of N
        // is equal to 2 or N is odd
        if (N == 2 or (N % 2 == 1)) {
 
            // Decrement N by 1
            N = N - 1;
 
            // Increment cnt by 1
            cnt++;
        }
 
        // If N is even
        else if (N % 2 == 0) {
 
            // Update N
            N = N / (N / 2);
 
            // Increment cnt by 1
            cnt++;
        }
    }
 
    // Return the number
    // of steps obtained
    return cnt;
}
 
// Driver Code
int main()
{
    long long int N = 35;
    cout << reduceToOne(N);
 
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
 
class GFG{
   
// Function to find the minimum number
// of steps required to reduce N to 1
static int reduceToOne(long N)
{
     
    // Stores the number
    // of steps required
    int cnt = 0;
 
    while (N != 1)
    {
         
        // If the value of N
        // is equal to 2 or N is odd
        if (N == 2 || (N % 2 == 1))
        {
             
            // Decrement N by 1
            N = N - 1;
 
            // Increment cnt by 1
            cnt++;
        }
 
        // If N is even
        else if (N % 2 == 0)
        {
             
            // Update N
            N = N / (N / 2);
 
            // Increment cnt by 1
            cnt++;
        }
    }
 
    // Return the number
    // of steps obtained
    return cnt;
}
 
// Driver Code
public static void main(String[] args)
{
    long N = 35;
     
    System.out.println(reduceToOne(N));
}
}
 
// This code is contributed by Dharanendra L V.

Python3

# python program for the above approach
 
# Function to find the minimum number
# of steps required to reduce N to 1
def reduceToOne(N):
   
    # Stores the number
    # of steps required
    cnt = 0
 
    while (N != 1):
 
        # If the value of N
        # is equal to 2 or N is odd
        if (N == 2 or (N % 2 == 1)):
 
            # Decrement N by 1
            N = N - 1
 
            # Increment cnt by 1
            cnt += 1
 
        # If N is even
        elif (N % 2 == 0):
 
            # Update N
            N = N / (N / 2)
 
            # Increment cnt by 1
            cnt += 1
 
    # Return the number
    # of steps obtained
    return cnt
 
# Driver Code
if __name__ == '__main__':
    N = 35
    print (reduceToOne(N))
 
# This code is contributed by mohit kumar 29.

C#

// C# program for the above approach
using System;
         
class GFG
{
 
// Function to find the minimum number
// of steps required to reduce N to 1
static int reduceToOne(long N)
{
     
    // Stores the number
    // of steps required
    int cnt = 0;
 
    while (N != 1)
    {
         
        // If the value of N
        // is equal to 2 or N is odd
        if (N == 2 || (N % 2 == 1))
        {
             
            // Decrement N by 1
            N = N - 1;
 
            // Increment cnt by 1
            cnt++;
        }
 
        // If N is even
        else if (N % 2 == 0)
        {
             
            // Update N
            N = N / (N / 2);
 
            // Increment cnt by 1
            cnt++;
        }
    }
 
    // Return the number
    // of steps obtained
    return cnt;
}
     
// Driver Code
public static void Main()
{
    long N = 35;
     
    Console.WriteLine(reduceToOne(N));
}
}
 
// This code s contributed by code_hunt.

Javascript

<script>
 
// Javascript program for the above approach
 
// Function to find the minimum number
// of steps required to reduce N to 1
function reduceToOne( N)
{
    // Stores the number
    // of steps required
    let cnt = 0;
 
    while (N != 1) {
 
        // If the value of N
        // is equal to 2 or N is odd
        if (N == 2 || (N % 2 == 1)) {
 
            // Decrement N by 1
            N = N - 1;
 
            // Increment cnt by 1
            cnt++;
        }
 
        // If N is even
        else if (N % 2 == 0) {
 
            // Update N
            N = Math.floor(N / Math.floor(N / 2));
 
            // Increment cnt by 1
            cnt++;
        }
    }
 
    // Return the number
    // of steps obtained
    return cnt;
}
 
// Driver Code
let N = 35;
document.write(reduceToOne(N));
 
// This code is contributed by jana_sayantan.
</script>
Producción: 

3

 

Tiempo Complejidad: O(1)
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por rohitmanathiya 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 *