Minimize the cost to split a number

Given an integer N ≥ 2, you can split the number as a sum of k integers i.e. N = k1 + k2 + … + kn where each kth element is ≥ 2 then the cost of splitting is calculated as maxDiv(k1) + maxDiv(k2) + … + maxDiv(kn) where maxDiv(x) is the maximum divisor of x which is < x.

The task is to split the number in such a way that the cost is minimized, print the minimized cost in the end.

Examples:



Input: N = 6
Output: 2
6 can be represented as (3 + 3) and the cost will be 1 + 1 = 2.

Input: N = 5
Output: 1

Approach:

  • When n is prime then the cost will be 1 as we don’t have to split n and the greatest divisor of n less than itself will be 1.
  • If n is odd and n – 2 is prime then n can be split into (2 + prime) which will cost 1 + 1 = 2.
  • If n is even then the cost will be 2 as according to Goldbach’s conjecture, every even number greater than 2 can be expressed as sum of two primes which is proven till 4 * 1018.
  • If all of the above conditions are not satisfied then n must be odd now and if 3 is subtracted from n then it will become even which can be expressed as (3 + even) = (3 + prime + prime) which will cost 3.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// check if a number is prime or not
bool isPrime(int x)
{
    // run a loop upto square root of x
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0)
            return 0;
    }
    return 1;
}
  
// Function to return the minimized cost
int minimumCost(int n)
{
    // If n is prime
    if (isPrime(n))
        return 1;
  
    // If n is odd and can be
    // split into (prime + 2)
    // then cost will be 1 + 1 = 2
    if (n % 2 == 1 && isPrime(n - 2))
        return 2;
  
    // Every non-prime even number
    // can be expressed as the
    // sum of two primes
    if (n % 2 == 0)
        return 2;
  
    // n is odd so n can be split into (3 + even)
    // further even part can be
    // split into (prime + prime)
    // (3 + prime + prime) will cost 3
    return 3;
}
  
// Driver code
int main()
{
    int n = 6;
    cout << minimumCost(n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.util.*;
  
class GFG
{
  
// check if a number is prime or not
static boolean isPrime(int x)
{
    // run a loop upto square root of x
    for (int i = 2; i * i <= x; i++) 
    {
        if (x % i == 0)
            return false;
    }
    return true;
}
  
// Function to return the minimized cost
static int minimumCost(int n)
{
    // If n is prime
    if (isPrime(n))
        return 1;
  
    // If n is odd and can be
    // split into (prime + 2)
    // then cost will be 1 + 1 = 2
    if (n % 2 == 1 && isPrime(n - 2))
        return 2;
  
    // Every non-prime even number
    // can be expressed as the
    // sum of two primes
    if (n % 2 == 0)
        return 2;
  
    // n is odd so n can be split into (3 + even)
    // further even part can be
    // split into (prime + prime)
    // (3 + prime + prime) will cost 3
    return 3;
}
  
// Driver code
public static void main(String args[])
{
    int n = 6;
    System.out.println(minimumCost(n));
}
}
  
// This code is contributed by
// Surendra_Gangwar

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach 
from math import sqrt
  
# check if a number is prime or not 
def isPrime(x) : 
  
    # run a loop upto square root of x 
    for i in range(2, int(sqrt(x)) + 1) :
        if (x % i == 0) :
            return 0
              
    return 1
  
# Function to return the minimized cost 
def minimumCost(n) :
  
    # If n is prime 
    if (isPrime(n)) :
        return 1
  
    # If n is odd and can be 
    # split into (prime + 2) 
    # then cost will be 1 + 1 = 2 
    if (n % 2 == 1 and isPrime(n - 2)) : 
        return 2
  
    # Every non-prime even number 
    # can be expressed as the 
    # sum of two primes 
    if (n % 2 == 0) :
        return 2
  
    # n is odd so n can be split into 
    # (3 + even) further even part can be 
    # split into (prime + prime) 
    # (3 + prime + prime) will cost 3 
    return 3
  
# Driver code 
if __name__ == "__main__"
  
    n = 6
    print(minimumCost(n)); 
      
# This code is contributed by Ryuga

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
public class GFG
{
   
// check if a number is prime or not
static bool isPrime(int x)
{
    // run a loop upto square root of x
    for (int i = 2; i * i <= x; i++) 
    {
        if (x % i == 0)
            return false;
    }
    return true;
}
   
// Function to return the minimized cost
static int minimumCost(int n)
{
    // If n is prime
    if (isPrime(n))
        return 1;
   
    // If n is odd and can be
    // split into (prime + 2)
    // then cost will be 1 + 1 = 2
    if (n % 2 == 1 && isPrime(n - 2))
        return 2;
   
    // Every non-prime even number
    // can be expressed as the
    // sum of two primes
    if (n % 2 == 0)
        return 2;
   
    // n is odd so n can be split into (3 + even)
    // further even part can be
    // split into (prime + prime)
    // (3 + prime + prime) will cost 3
    return 3;
}
   
// Driver code
public static void Main(String []args)
{
    int n = 6;
    Console.WriteLine(minimumCost(n));
}
}
   
// This code is contributed by
// Rajput-Ji

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the approach
// check if a number is prime or not
function isPrime($x)
{
    // run a loop upto square root of x
    for ($i = 2; $i * $i <= $x; $i++) 
    {
        if ($x % $i == 0)
            return 0;
    }
    return 1;
}
  
// Function to return the minimized cost
function minimumCost($n)
{
    // If n is prime
    if (isPrime($n))
        return 1;
  
    // If n is odd and can be
    // split into (prime + 2)
    // then cost will be 1 + 1 = 2
    if ($n % 2 == 1 && isPrime($n - 2))
        return 2;
  
    // Every non-prime even number
    // can be expressed as the
    // sum of two primes
    if ($n % 2 == 0)
        return 2;
  
    // n is odd so n can be split into (3 + even)
    // further even part can be
    // split into (prime + prime)
    // (3 + prime + prime) will cost 3
    return 3;
}
  
// Driver code
$n = 6;
echo(minimumCost($n));
  
// This code is contributed by Code_Mech.

chevron_right


Output:

2


My Personal Notes arrow_drop_up

pawanasipugmailcom

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.