Open In App

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

Improve
Improve
Like Article
Like
Save
Share
Report

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:

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 <bits/stdc++.h>
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




<script>
    // JavaScript program for the above approach
 
    // Function check whether a number
    // is prime or not
    const isPrime = (n) => {
        // Corner case
        if (n <= 1)
            return false;
 
        // Check from 2 to square root of n
        for (let i = 2; i <= parseInt(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
    const 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
            let count = 0;
            let 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
                    let temp = N;
 
                    // Update the number by decrementing
                    // with highest divisor
                    N -= parseInt(temp / i);
 
                    // Increment count by 1
                    count++;
                    if (isPrime(N))
                        return count;
                }
                i++;
            }
 
            // Return the count
            return count;
        }
    }
 
    // Driver Code
    let N = 38;
    document.write(minOperation(N));
 
    // This code is contributed by rakeshsahni
 
</script>


 
 

Output

1

 

Time Complexity: O(sqrtN)

 

Auxiliary Space: O(1)

 



Last Updated : 26 Oct, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads