# Minimum operations to reduce N to a prime number by subtracting with its highest divisor

• Difficulty Level : Hard
• Last Updated : 26 Oct, 2021

Given a positive integer N. In one operation subtract N with its highest divisor other than N and 1. The task is to find minimum operations required to reduce N exactly to a prime number.

Examples:

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

Input: N = 38
Output: 1
Explanation: Highest divisor of 38 is 19, so subtract it (38 – 19) = 19. 19 is a prime number.
So, number of operations required = 1.

Input: N = 69
Output: 2

Approach: This problem can be solved by using simple concepts of maths. Follow the steps below to solve the given problem.

• At first, check whether N is already prime or not.
• If N is already a prime, return 0.
• Else, Initialize a variable say count = 0 to store the number of operations required.
• Initialize a variable say i=2 and run a while loop till N!=i
• Run while loop and on each iteration subtract current value of N with its largest divisor.
• Compute the steps and increment the count by 1.
• Return the count.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function check whether a number``// is prime or not``bool` `isPrime(``int` `n)``{``    ``// Corner case``    ``if` `(n <= 1)``        ``return` `false``;` `    ``// Check from 2 to square root of n``    ``for` `(``int` `i = 2; i <= ``sqrt``(n); i++)``        ``if` `(n % i == 0)``            ``return` `false``;` `    ``return` `true``;``}` `// Function to minimum operations required``// to reduce the number to a prime number``int` `minOperation(``int` `N)``{``    ``// Because 1 cannot be converted to prime``    ``if` `(N == 1)``        ``return` `-1;` `    ``// If given number is already prime``    ``// return 0``    ``if` `(isPrime(N) == ``true``) {``        ``return` `0;``    ``}` `    ``// If number is not prime``    ``else` `{``        ``// Variable for total count``        ``int` `count = 0;``        ``int` `i = 2;` `        ``// If number is not equal to i``        ``while` `(N != i) {``            ``// If N is completely divisible by i``            ``while` `(N % i == 0) {``                ``// Temporary variable to store``                ``// current number``                ``int` `temp = N;` `                ``// Update the number by decrementing``                ``// with highest divisor``                ``N -= (temp / i);` `                ``// Increment count by 1``                ``count++;``                ``if` `(isPrime(N))``                    ``return` `count;``            ``}``            ``i++;``        ``}` `        ``// Return the count``        ``return` `count;``    ``}``}` `// Driver Code``int` `main()``{``    ``int` `N = 38;` `    ``cout << minOperation(N);` `    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `java.util.Arrays;` `class` `GFG {``    ``// Function check whether a number``    ``// is prime or not``    ``public` `static` `boolean` `isPrime(``int` `n) {``        ``// Corner case``        ``if` `(n <= ``1``)``            ``return` `false``;` `        ``// Check from 2 to square root of n``        ``for` `(``int` `i = ``2``; i <= Math.sqrt(n); i++)``            ``if` `(n % i == ``0``)``                ``return` `false``;` `        ``return` `true``;``    ``}` `    ``// Function to minimum operations required``    ``// to reduce the number to a prime number``    ``public` `static` `int` `minOperation(``int` `N) {``        ``// Because 1 cannot be converted to prime``        ``if` `(N == ``1``)``            ``return` `-``1``;` `        ``// If given number is already prime``        ``// return 0``        ``if` `(isPrime(N) == ``true``) {``            ``return` `0``;``        ``}` `        ``// If number is not prime``        ``else` `{``            ``// Variable for total count``            ``int` `count = ``0``;``            ``int` `i = ``2``;` `            ``// If number is not equal to i``            ``while` `(N != i) {``                ``// If N is completely divisible by i``                ``while` `(N % i == ``0``) {``                    ``// Temporary variable to store``                    ``// current number``                    ``int` `temp = N;` `                    ``// Update the number by decrementing``                    ``// with highest divisor``                    ``N -= (temp / i);` `                    ``// Increment count by 1``                    ``count++;``                    ``if` `(isPrime(N))``                        ``return` `count;``                ``}``                ``i++;``            ``}` `            ``// Return the count``            ``return` `count;``        ``}``    ``}` `    ``// Driver Code``    ``public` `static` `void` `main(String args[]) {``        ``int` `N = ``38``;` `        ``System.out.println(minOperation(N));``    ``}``}` `// This code is contributed by gfgking.`

## Python3

 `# python program for the above approach``import` `math` `# Function check whether a number``# is prime or not``def` `isPrime(n):` `    ``# Corner case``    ``if` `(n <``=` `1``):``        ``return` `False` `    ``# Check from 2 to square root of n``    ``for` `i ``in` `range``(``2``, ``int``(math.sqrt(n)) ``+` `1``):``        ``if` `(n ``%` `i ``=``=` `0``):``            ``return` `False` `    ``return` `True` `# Function to minimum operations required``# to reduce the number to a prime number``def` `minOperation(N):` `    ``# Because 1 cannot be converted to prime``    ``if` `(N ``=``=` `1``):``        ``return` `-``1` `    ``# If given number is already prime``    ``# return 0``    ``if` `(isPrime(N) ``=``=` `True``):``        ``return` `0` `    ``# If number is not prime``    ``else``:``        ``# Variable for total count``        ``count ``=` `0``        ``i ``=` `2` `        ``# If number is not equal to i``        ``while` `(N !``=` `i):``          ` `            ``# If N is completely divisible by i``            ``while` `(N ``%` `i ``=``=` `0``):``              ` `                ``# Temporary variable to store``                ``# current number``                ``temp ``=` `N` `                ``# Update the number by decrementing``                ``# with highest divisor``                ``N ``-``=` `(temp ``/``/` `i)` `                ``# Increment count by 1``                ``count ``+``=` `1``                ``if` `(isPrime(N)):``                    ``return` `count``            ``i ``+``=` `1` `        ``# Return the count``        ``return` `count` `# Driver Code``if` `__name__ ``=``=` `"__main__"``:``    ``N ``=` `38``    ``print``(minOperation(N))` `# This code is contributed by rakeshsahni`

## C#

 `// C# program for the above approach``using` `System;` `public` `class` `GFG {``    ` `    ``// Function check whether a number``    ``// is prime or not``    ``public` `static` `bool` `isPrime(``int` `n)``    ``{``      ` `        ``// Corner case``        ``if` `(n <= 1)``            ``return` `false``;` `        ``// Check from 2 to square root of n``        ``for` `(``int` `i = 2; i <= Math.Sqrt(n); i++)``            ``if` `(n % i == 0)``                ``return` `false``;` `        ``return` `true``;``    ``}` `    ``// Function to minimum operations required``    ``// to reduce the number to a prime number``    ``public` `static` `int` `minOperation(``int` `N) {``        ``// Because 1 cannot be converted to prime``        ``if` `(N == 1)``            ``return` `-1;` `        ``// If given number is already prime``        ``// return 0``        ``if` `(isPrime(N) == ``true``) {``            ``return` `0;``        ``}` `        ``// If number is not prime``        ``else` `{``            ``// Variable for total count``            ``int` `count = 0;``            ``int` `i = 2;` `            ``// If number is not equal to i``            ``while` `(N != i) {``                ` `                ``// If N is completely divisible by i``                ``while` `(N % i == 0) {``                    ` `                    ``// Temporary variable to store``                    ``// current number``                    ``int` `temp = N;` `                    ``// Update the number by decrementing``                    ``// with highest divisor``                    ``N -= (temp / i);` `                    ``// Increment count by 1``                    ``count++;``                    ` `                    ``if` `(isPrime(N))``                        ``return` `count;``                ``}``                ``i++;``            ``}` `            ``// Return the count``            ``return` `count;``        ``}``    ``}` `    ``// Driver Code``    ``public` `static` `void` `Main(``string` `[]args) {``        ``int` `N = 38;` `        ``Console.WriteLine(minOperation(N));``    ``}``}` `// This code is contributed by AnkThon`

## Javascript

 ``

Output
`1`

Time Complexity: O(sqrtN)

Auxiliary Space: O(1)

My Personal Notes arrow_drop_up