Skip to content
Related Articles
Get the best out of our app
GFG App
Open App
geeksforgeeks
Browser
Continue

Related Articles

Divide a number into two parts

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

Given an integer N containing the digit 4 at least once. The task is to divide the number into two parts x1 and x2 such that: 

  • x1 + x2 = N.
  • And none of the parts contain the digit 4.

Note that there may be multiple answers.

Examples: 

Input: N = 4 
Output: 1 3 
1 + 3 = 4

Input: N = 9441 
Output: 9331 110 
9331 + 110 = 9441 

Naive Approach: The idea is to run two nested for loops and pick two numbers whose sum is n and they do not have any digit equal to 4. Below are the steps:

  • Run two nested for loops from 1 to N.
  • If both the numbers from that nested for loops sum to N then,
    • Convert both the number into strings to check whether they contain ‘4’ or not
    • Declare a boolean variable temp with the value true
    • Now check for both the strings and if any one of the strings contains ‘4’, then make temp as false
    • In last if the temp is false then at least one number contains 4 else print those numbers

Below is the implementation of the above approach:

C++




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to print the two parts
void twoParts(int n)
{
    // Run loop to pick two numbers
    for (int i = 1; i <= n; i++) {
 
        for (int j = 1; j <= n; j++) {
 
            // When both numbers gives sum as n
            if (i + j == n) {
               
                // convert both number in
                // string to check whether
                // they contain 4 or not
                string a = to_string(i);
                string b = to_string(j);
 
                // This will tell that at
                // least one number
                // contains 4 or not
                bool temp = true;
 
                // Check first number contain
                // 4 or not
                for (int k = 0; k < a.size(); k++) {
                    if (a[k] == '4') {
                        temp = false;
                        break;
                    }
                }
 
                // check second number
                // contain 4 or not
                for (int k = 0; k < b.size(); k++) {
                    if (b[k] == '4') {
                        temp = false;
                        break;
                    }
                }
 
                // If both the number doesn't
                // contain 4
                if (temp == true) {
                    cout << i << " " << j << endl;
                    return;
                }
            }
        }
    }
}
 
// Driver Code
int main()
{
    int N = 9441;
    twoParts(N);
    return 0;
}


Python3




def twoParts(n):
    # Run loop to pick two numbers
    for i in range(1, n+1):
        for j in range(1, n+1):
            # When both numbers gives sum as n
            if i + j == n:
                # convert both number in
                # string to check whether
                # they contain 4 or not
                a = str(i)
                b = str(j)
 
                # This will tell that at
                # least one number
                # contains 4 or not
                temp = True
 
                # Check first number contain
                # 4 or not
                for k in range(len(a)):
                    if a[k] == '4':
                        temp = False
                        break
 
                # check second number
                # contain 4 or not
                for k in range(len(b)):
                    if b[k] == '4':
                        temp = False
                        break
 
                # If both the number doesn't
                # contain 4
                if temp == True:
                    print(i, j)
                    return
 
 
N = 9441
twoParts(N)


Output-

50 9391

Time Complexity: O(N2*maximum length of any number), because of two nested for loops and loop for checking whether any number contains 4 or not 
Auxiliary Space: O(1), because no extra space has been used

Approach: Since number can be too large take the number as string. Divide it into two strings:  

  • For string 1, find all the positions of digit 4 in the string change it to 3 we can also change it to another number.
  • For the second string put 1 at all positions of digit 4 and put 0 at all remaining positions from the 1st position of digit 4 to the end of the string.

Below is the implementation of the above approach: 

C++




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to print the two parts
void twoParts(string str)
{
    int flag = 0;
    string a = "";
 
    // Find the position of 4
    for (int i = 0; i < str.length(); i++) {
        if (str[i] == '4') {
            str[i] = '3';
            a += '1';
            flag = 1;
        }
 
        // If current character is not '4'
        // but appears after the first
        // occurrence of '4'
        else if (flag)
            a += '0';
    }
 
    // Print both the parts
    cout << str << " " << a;
}
 
// Driver code
int main()
{
    string str = "9441";
    twoParts(str);
 
    return 0;
}


Java




// Java implementation of the approach
class GfG {
 
    // Function to print the two parts
    static void twoParts(String str)
    {
        int flag = 0;
        String a = "";
        char[] gfg = str.toCharArray();
 
        // Find the position of 4
        for (int i = 0; i < str.length(); i++) {
            if (gfg[i] == '4') {
                gfg[i] = '3';
                a += '1';
                flag = 1;
            }
 
            // If current character is not '4'
            // but appears after the first
            // occurrence of '4'
            else if (flag != 0)
                a += '0';
        }
 
        str = new String(gfg);
 
        // Print both the parts
        System.out.print(str + " " + a);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "9441";
        twoParts(str);
    }
}
 
// This code is contributed by Rituraj Jain


Python3




# Python3 implementation of the approach
 
# Function to print the two parts
 
 
def twoParts(string):
 
    flag = 0
    a = ""
 
    # Find the position of 4
    for i in range(len(string)):
 
        if (string[i] == '4'):
            string[i] = '3'
            a += '1'
            flag = 1
 
        # If current character is not '4'
        # but appears after the first
        # occurrence of '4'
        elif (flag):
            a += '0'
 
    string = "".join(string)
 
    # Print both the parts
    print(string, a)
 
 
# Driver code
if __name__ == "__main__":
 
    string = "9441"
 
    twoParts(list(string))
 
# This code is contributed by Ryuga


C#




// C# implementation of the approach
using System;
 
class GfG {
 
    // Function to print the two parts
    static void twoParts(string str)
    {
        int flag = 0;
        string a = "";
        char[] gfg = str.ToCharArray();
 
        // Find the position of 4
        for (int i = 0; i < str.Length; i++) {
            if (gfg[i] == '4') {
                gfg[i] = '3';
                a += '1';
                flag = 1;
            }
 
            // If current character is not '4'
            // but appears after the first
            // occurrence of '4'
            else if (flag != 0)
                a += '0';
        }
 
        str = new String(gfg);
 
        // Print both the parts
        Console.WriteLine(str + " " + a);
    }
 
    // Driver code
    static void Main()
    {
        string str = "9441";
        twoParts(str);
    }
}
 
// This code is contributed by mits


PHP




<?php
// PHP implementation of the approach
 
// Function to print the two parts
function twoParts($str)
{
    $flag = 0;
    $a = "";
 
    // Find the position of 4
    for ($i = 0; $i < strlen($str); $i++)
    {
        if ($str[$i] == '4')
        {
            $str[$i] = '3';
            $a .= '1';
            $flag = 1;
        }
 
        // If current character is not '4'
        // but appears after the first
        // occurrence of '4'
        else if ($flag)
            $a .= '0';
    }
 
    // Print both the parts
    echo $str . " " . $a;
}
 
// Driver code
$str = "9441";
twoParts($str);
 
// This code is contributed by mits
?>


Javascript




<script>
// javascript implementation of the approach
 
   
    // Function to print the two parts
     function twoParts( str)
    {
        var flag = 0;
        var a = "";
        var gfg = str.split('') ;
       
        // Find the position of 4
        for (var i = 0; i < str.length; i++)
        {
            if (gfg[i] == '4')
            {
                gfg[i] = '3';
                a += '1';
                flag = 1;
            }
       
            // If current character is not '4'
            // but appears after the first
            // occurrence of '4'
            else if (flag != 0)
                a += '0';
        }
           
       
        // Print both the parts
        document.write(gfg.join('') + " " + a);
    }
   
    // Driver code
 
        var str = "9441";
        twoParts(str);
         
        // This code is contributed by bunnyram19.
        </script>


Output: 

9331 110

 

Time Complexity: O(N)
Auxiliary Space: O(N)


My Personal Notes arrow_drop_up
Last Updated : 25 Apr, 2023
Like Article
Save Article
Similar Reads
Related Tutorials