Dado un número N. La tarea es reducir el número N dado a 1 en el número mínimo de pasos. Puede realizar cualquiera de las siguientes operaciones en cada paso.
- Operación 1 : si el número es par, entonces puedes dividir el número por 2.
- Operación 2 : si el número es impar, puede realizar (n+1) o (n-1).
Debe imprimir el número mínimo de pasos necesarios para reducir el número N a 1 realizando las operaciones anteriores.
Ejemplos :
Input : n = 15 Output : 5 15 is odd 15+1=16 16 is even 16/2=8 8 is even 8/2=4 4 is even 4/2=2 2 is even 2/2=1 Input : n = 7 Output : 4 7->6 6->3 3->2 2->1
Método 1:
la idea es calcular recursivamente el número mínimo de pasos necesarios.
- Si el número es par, entonces solo podemos dividir el número por 2.
- Pero, cuando el número es impar, podemos incrementarlo o disminuirlo en 1. Entonces, usaremos la recursividad tanto para n-1 como para n+1 y devolveremos el que tenga el número mínimo de operaciones.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program to count minimum // steps to reduce a number #include <cmath> #include <iostream> using namespace std; int countways(int n) { if (n == 1) return 0; else if (n % 2 == 0) return 1 + countways(n / 2); else return 1 + min(countways(n - 1), countways(n + 1)); } // Driver code int main() { int n = 15; cout << countways(n) << "\n"; return 0; }
Java
// Java program to count minimum // steps to reduce a number class Geeks { static int countways(int n) { if (n == 1) return 0; else if (n % 2 == 0) return 1 + countways(n / 2); else return 1 + Math.min(countways(n - 1), countways(n + 1)); } // Driver code public static void main(String args[]) { int n = 15; System.out.println(countways(n)); } } // This code is contributed by ankita_saini
Python3
# Python3 program to count minimum # steps to reduce a number def countways(n): if (n == 1): return 0; elif (n % 2 == 0): return 1 + countways(n / 2); else: return 1 + min(countways(n - 1), countways(n + 1)); # Driver code n = 15; print(countways(n)); # This code is contributed by PrinciRaj1992
C#
// C# program to count minimum // steps to reduce a number using System; class GFG { static int countways(int n) { if (n == 1) return 0; else if (n % 2 == 0) return 1 + countways(n / 2); else return 1 + Math.Min(countways(n - 1), countways(n + 1)); } // Driver code static public void Main() { int n = 15; Console.Write(countways(n)); } } // This code is contributed by Raj
Javascript
<script> // Javascript program to count minimum // steps to reduce a number function countways(n) { if (n == 1) return 0; else if (n % 2 == 0) return 1 + countways(n / 2); else return 1 + Math.min(countways(n - 1), countways(n + 1)); } // Driver code let n = 15; document.write(countways(n)); // This code is contributed by unknown2108 </script>
5
El enfoque mencionado anteriormente tiene una complejidad de tiempo de O(2^n). Es posible reducir esta complejidad a O(log n).
Método 2 – (Solución eficiente)
Está claro con poca observación que realizar un incremento de 1 o una disminución de 1 en un número impar puede dar como resultado un número par, uno de ellos divisible por 4. Para un número impar, la única operación posible es un incremento de 1 o una disminución de 1, lo más seguro es que una operación resulte en un número divisible por cuatro, esta es claramente la elección óptima.
Algorithm : 1. Initialize count = 0 2. While number is greater than one perform following steps - Perform count++ for each iteration if num % 2 == 0, perform division else if num % 4 == 3, perform increment else perform decrement (as odd % 4 is either 1 or 3) 3. return count;
C++
// C++ program for the above approach #include <iostream> using namespace std; int countSteps(int n) { int count = 0; while (n > 1) { count++; // num even, divide by 2 if (n % 2 == 0) n /= 2; // num odd, n%4 == 1 // or n==3(special edge case), // decrement by 1 else if (n % 4 == 1||n==3) n -= 1; // num odd, n%4 == 3, increment by 1 else n += 1; } return count; } // driver code int main() { int n = 15; // Function call cout << countSteps(n) << "\n"; return 0; }
Java
// Java program for the above approach import java.util.*; import java.lang.*; import java.io.*; class GFG{ public static int countSteps(int n) { int count = 0; while (n > 1) { count++; // num even, divide by 2 if (n % 2 == 0) n /= 2; // num odd, n%4 == 1 // or n==3(special edge case), // decrement by 1 else if (n % 4 == 1||n==3) n -= 1; // num odd, n%4 == 3, increment by 1 else n += 1; } return count; } // Driver code public static void main(String[] args) { int n = 15; // Function call System.out.print(countSteps(n)); } } // This code is contributed by paragpallavsingh
Python3
# Python3 program for the above approach def countSteps(n): count = 0 while (n > 1): count += 1 # num even, divide by 2 if (n % 2 == 0): n //= 2 # num odd, n%4 == 1 # or n==3(special edge case), # decrement by 1 elif (n % 4 == 1 or n == 3): n -= 1 # num odd, n%4 == 3, increment by 1 else: n += 1 return count # Driver code if __name__ == "__main__": n = 15 # Function call print(countSteps(n)) # This code is contributed by chitranayal
C#
// C# program for the above approach using System; class GFG{ public static int countSteps(int n) { int count = 0; while (n > 1) { count++; // num even, divide by 2 if (n % 2 == 0) n /= 2; // num odd, n%4 == 1 // or n==3(special edge case), // decrement by 1 else if (n % 4 == 1||n==3) n -= 1; // num odd, n%4 == 3, increment by 1 else n += 1; } return count; } // Driver code static public void Main () { int n = 15; // Function call Console.WriteLine(countSteps(n)); } } // This code is contributed by avanitrachhadiya2155
Javascript
<script> // Javascript program for the above approach function countSteps(n) { let count = 0; while (n > 1) { count++; // num even, divide by 2 if (n % 2 == 0) n = Math.floor(n/2); // num odd, n%4 == 1 // or n==3(special edge case), // decrement by 1 else if (n % 4 == 1||n==3) n -= 1; // num odd, n%4 == 3, increment by 1 else n += 1; } return count; } // Driver code let n = 15; // Function call document.write(countSteps(n)); // This code is contributed by patel2127 </script>
5
Complejidad de tiempo: O (logN)