Skip to content
Related Articles

Related Articles

Divide a big number into two parts that differ by k

View Discussion
Improve Article
Save Article
Like Article
  • Difficulty Level : Hard
  • Last Updated : 23 May, 2022

Given a big positive number N. The task is divide N into two number ‘A’ and ‘B’ such that difference between them is K (1 <= K <= 10100) i.e A – B = K. 

Examples: 

Input : N = 10, K = 2
Output : A = 6 B = 4

Input : N = 20, K = 4
Output : A = 12 B = 8

Let the two required number be ‘A’ and ‘B’. So, we know sum of ‘A’ and ‘B’ will end upto N. 
So, one equation became, 
A + B = N 
And also, we want the difference between ‘A’ and ‘B’ equals to ‘K’. 
So, another equation becomes, 
A – B = K 
On adding both the equation, we get 
2*A = N + K
So, A = (N + K)/2 
Then we can find B by, B = (N – A)
Now, to handle the Big Integer, we have store Integers in character array and define a function to perform the operation on them.

Below is C implementation of this approach:  

C++




// C++ program to Divide a Big
// Number into two parts
#include <bits/stdc++.h>
using namespace std;
#define MAX 100
 
// Function to adds two Numbers
// represented as array of character.
void add(char v1[], char v2[])
{
    int i, d, c = 0;
 
    // length of string
    int l1 = strlen(v1);
    int l2 = strlen(v2);
 
    // initializing extra character
    // position to 0
    for (i = l1; i < l2; i++)
        v1[i] = '0';
 
    for (i = l2; i < l1; i++)
        v2[i] = '0';
 
    // Adding each element of character
    // and storing the carry.
    for (i = 0; i < l1 || i < l2; i++) {
        d = (v1[i] - '0') + (v2[i] - '0') + c;
        c = d / 10;
        d %= 10;
        v1[i] = '0' + d;
    }
 
    // If remainder remains.
    while (c) {
        v1[i] = '0' + (c % 10);
        c /= 10;
        i++;
    }
 
    v1[i] = '\0';
    v2[l2] = '\0';
}
 
// Function to subtracts two numbers
// represented by string.
void subs(char v1[], char v2[])
{
    int i, d, c = 0;
 
    // Finding the length of the string.
    int l1 = strlen(v1);
    int l2 = strlen(v2);
 
    // initializing extra character position to 0.
    for (i = l2; i < l1; i++)
        v2[i] = '0';
 
    // Subtracting each element of character.
    for (i = 0; i < l1; i++) {
        d = (v1[i] - '0' - c) - (v2[i] - '0');
 
        if (d < 0) {
            d += 10;
            c = 1;
        }
        else
            c = 0;
 
        v1[i] = '0' + d;
    }
 
    v2[l2] = '\0';
    i = l1 - 1;
 
    while (i > 0 && v1[i] == '0')
        i--;
 
    v1[i + 1] = '\0';
}
 
// Function divides a number represented by
// character array a constant.
int divi(char v[], int q)
{
    int i, l = strlen(v);
 
    int c = 0, d;
 
    // Dividing each character element by constant.
    for (i = l - 1; i >= 0; i--) {
        d = c * 10 + (v[i] - '0');
        c = d % q;
        d /= q;
        v[i] = '0' + d;
    }
 
    i = l - 1;
 
    while (i > 0 && v[i] == '0')
        i--;
 
    v[i + 1] = '\0';
    return c;
}
 
// Function to reverses the character array.
void rev(char v[])
{
    int l = strlen(v);
    int i;
    char cc;
 
    // Reversing the array.
    for (i = 0; i < l - 1 - i; i++) {
        cc = v[i];
        v[i] = v[l - 1 - i];
        v[l - i - 1] = cc;
    }
}
 
// Wrapper Function
void divideWithDiffK(char a[], char k[])
{
 
    // Reversing the character array.
    rev(a);
    rev(k);
 
    // Adding the each element of both array
    // and storing the sum in array a[].
    add(a, k);
 
    // Dividing the array a[] by 2.
    divi(a, 2);
 
    // Reversing the character array to get output.
    rev(a);
    cout <<" "<< a;
 
    // Subtracting each element of array
    // i.e calculating a = a - b
    rev(a);
    subs(a, k);
 
    // Reversing the character array to get output.
    rev(a);
    cout <<" "<< a;
}
 
// Driven Program
int main()
{
    char a[MAX] = "100", k[MAX] = "20";
    divideWithDiffK(a, k);
    return 0;
}
// this code is contributed by shivanisinghss2110

C




// C program to Divide a Big
// Number into two parts
#include <stdio.h>
#include <string.h>
#define MAX 100
 
// Function to adds two Numbers
// represented as array of character.
void add(char v1[], char v2[])
{
    int i, d, c = 0;
 
    // length of string
    int l1 = strlen(v1);
    int l2 = strlen(v2);
 
    // initializing extra character
    // position to 0
    for (i = l1; i < l2; i++)
        v1[i] = '0';
 
    for (i = l2; i < l1; i++)
        v2[i] = '0';
 
    // Adding each element of character
    // and storing the carry.
    for (i = 0; i < l1 || i < l2; i++) {
        d = (v1[i] - '0') + (v2[i] - '0') + c;
        c = d / 10;
        d %= 10;
        v1[i] = '0' + d;
    }
 
    // If remainder remains.
    while (c) {
        v1[i] = '0' + (c % 10);
        c /= 10;
        i++;
    }
 
    v1[i] = '\0';
    v2[l2] = '\0';
}
 
// Function to subtracts two numbers
// represented by string.
void subs(char v1[], char v2[])
{
    int i, d, c = 0;
 
    // Finding the length of the string.
    int l1 = strlen(v1);
    int l2 = strlen(v2);
 
    // initializing extra character position to 0.
    for (i = l2; i < l1; i++)
        v2[i] = '0';
 
    // Subtracting each element of character.
    for (i = 0; i < l1; i++) {
        d = (v1[i] - '0' - c) - (v2[i] - '0');
 
        if (d < 0) {
            d += 10;
            c = 1;
        }
        else
            c = 0;
 
        v1[i] = '0' + d;
    }
 
    v2[l2] = '\0';
    i = l1 - 1;
 
    while (i > 0 && v1[i] == '0')
        i--;
 
    v1[i + 1] = '\0';
}
 
// Function divides a number represented by
// character array a constant.
int divi(char v[], int q)
{
    int i, l = strlen(v);
 
    int c = 0, d;
 
    // Dividing each character element by constant.
    for (i = l - 1; i >= 0; i--) {
        d = c * 10 + (v[i] - '0');
        c = d % q;
        d /= q;
        v[i] = '0' + d;
    }
 
    i = l - 1;
 
    while (i > 0 && v[i] == '0')
        i--;
 
    v[i + 1] = '\0';
    return c;
}
 
// Function to reverses the character array.
void rev(char v[])
{
    int l = strlen(v);
    int i;
    char cc;
 
    // Reversing the array.
    for (i = 0; i < l - 1 - i; i++) {
        cc = v[i];
        v[i] = v[l - 1 - i];
        v[l - i - 1] = cc;
    }
}
 
// Wrapper Function
void divideWithDiffK(char a[], char k[])
{
 
    // Reversing the character array.
    rev(a);
    rev(k);
 
    // Adding the each element of both array
    // and storing the sum in array a[].
    add(a, k);
 
    // Dividing the array a[] by 2.
    divi(a, 2);
 
    // Reversing the character array to get output.
    rev(a);
    printf("%s ", a);
 
    // Subtracting each element of array
    // i.e calculating a = a - b
    rev(a);
    subs(a, k);
 
    // Reversing the character array to get output.
    rev(a);
    printf("%s", a);
}
 
// Driven Program
int main()
{
    char a[MAX] = "100", k[MAX] = "20";
    divideWithDiffK(a, k);
    return 0;
}

Output: 

60 40

 


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!