Given pairwise sum of n numbers, find the numbers
Pairwise sum of n (where n >= 3) numbers are given in a specified order, find the numbers. The order has pair sum of first and second, then first and third, first and fourth, … second and third, second and fourth, .. and so on. Consider an example: n = 4, let the numbers be {a, b, c, d}, their pairwise sum is given in the order arr[] = {a+b, a+c, a+d, b+c, b+d, c+d}.
Examples:
Input : arr[] = {11, 18, 13, 13, 8, 5} Output : {8, 3, 10, 5} 8+3 = 11, 8+10 = 18, 8+5 = 13, 3+10 = 13, 3+5 = 8, ... Input : arr[] = {13, 10, 14, 9, 17, 21, 16, 18, 13, 17} Output : {3, 10, 7, 11, 6}
Asked in Amazon
Approach is purely based on mathematics which is illustrated below:
n = 3, {a+b, a+c, b+c} We can find b-a = arr[2] - arr[1] = (b+c) - (a+c) We can find b = (arr[0] + (b-a))/2 = (a + b + (b - a))/2 = b We can find a = arr[0] - b = a n = 4, {a+b, a+c, a+d, b+c, b+d, c+d} We can find b-a = arr[3] - arr[1] = (b+c) - (a+c) We can find b = (arr[0] + (b-a)) / 2 = ((a+b) + (b-a)) / 2 a = arr[0] - b = (a+b) - b c = arr[1] - a = (a+c) - a d = arr[2] - a = (a+d) - a Observation : b_minus_a = b - a = arr[n-1] - arr[1] b = (arr[0] + b_minus_a)/2 a = (arr[0] - b) c = arr[1] - a d = arr[2] - a .......... n = 5, {a+b, a+c, a+d, a+e, b+c, b+d, b+e, c+d, c+e, d+e} Then calculate b-a = arr[n-1] - arr[1] = (b+c) - (a+c) Then b = (arr[0] + (b-a)) / 2 = ((a+b) + (b-a)) / 2 a = arr[0] - b = (a+b) - b Then for i=1 to n-2, remaining numbers are calculated as arr[i] - a, like c = arr[1] - a = (a+c) - a d = arr[2] - a = (a+c) - a and so on, . . . . last number = arr[n-2] - a
Below is the implementation of above idea.
C++
// C++ program to find n numbers from given ordered // pairwise sum of them. #include <bits/stdc++.h> using namespace std; // Note : n is not size of array, but number of // elements whose pairwise sum is stored // in arr[] void findNumbers( int arr[], int n) { int num[n]; // b-a is calculated here int b_minus_a = arr[n-1] - arr[1]; // b is calculated here num[1] = (arr[0] + b_minus_a) / 2; // a is calculated here num[0] = arr[0] - num[1]; // to calculate all the other numbers for ( int i=1; i<=(n-2); i++) num[i+1] = arr[i] - num[0]; // display the numbers cout << "Numbers are: " ; for ( int i=0; i<n; i++) cout << num[i] << " " ; } //Driver program int main() { int arr[] = {13, 10, 14, 9, 17, 21, 16, 18, 13, 17}; int n = 5; // n is not size of array, but number of // elements whose pairwise sum is stored // in arr[] findNumbers(arr, n); return 0; } |
Java
// Java program to find n numbers from given // ordered pairwise sum of them. class GFG { // Note : n is not size of array, but number // of elements whose pairwise sum is stored // in arr[] static void findNumbers( int arr[], int n) { int num[] = new int [n]; // b-a is calculated here int b_minus_a = arr[n- 1 ] - arr[ 1 ]; // b is calculated here num[ 1 ] = (arr[ 0 ] + b_minus_a) / 2 ; // a is calculated here num[ 0 ] = arr[ 0 ] - num[ 1 ]; // to calculate all the other numbers for ( int i = 1 ; i <= (n - 2 ); i++) num[i+ 1 ] = arr[i] - num[ 0 ]; // display the numbers System.out.print( "Numbers are: " ); for ( int i = 0 ; i < n; i++) System.out.print(num[i] + " " ); } // Driver method public static void main(String[] args) { int arr[] = { 13 , 10 , 14 , 9 , 17 , 21 , 16 , 18 , 13 , 17 }; // n is not size of array, but number of // elements whose pairwise sum is stored // in arr[] int n = 5 ; findNumbers(arr, n); } } // This code is contributed by Anant Agarwal. |
Python3
# Python3 program to find n numbers # from given ordered pairwise sum of them. # Note : n is not size of array, # but number of elements whose # pairwise sum is stored in arr[] def findNumbers(arr, n): num = [ 0 for i in range (n)] # b-a is calculated here b_minus_a = arr[n - 1 ] - arr[ 1 ] # b is calculated here num[ 1 ] = (arr[ 0 ] + b_minus_a) / / 2 # a is calculated here num[ 0 ] = arr[ 0 ] - num[ 1 ] # to calculate all the other numbers for i in range ( 1 , (n - 2 ) + 1 ): num[i + 1 ] = arr[i] - num[ 0 ] # display the numbers print ( "Numbers are: " , end = "") for i in range (n): print (num[i], end = ", " ) # Driver Code arr = [ 13 , 10 , 14 , 9 , 17 , 21 , 16 , 18 , 13 , 17 ] n = 5 # n is not size of array, but number # of elements whose pairwise sum is # stored in arr[] findNumbers(arr, n) # This code is contributed by Anant Agarwal. |
C#
// C# program to find n numbers from // given ordered pairwise sum of them. using System; class GFG { // Note : n is not size of array, but // number of elements whose pairwise // sum is stored in arr[] static void findNumbers( int []arr, int n) { int []num = new int [n]; // b-a is calculated here int b_minus_a = arr[n - 1] - arr[1]; // b is calculated here num[1] = (arr[0] + b_minus_a) / 2; // a is calculated here num[0] = arr[0] - num[1]; // to calculate all the other numbers for ( int i = 1; i <= (n - 2); i++) num[i + 1] = arr[i] - num[0]; // display the numbers Console.Write( "Numbers are: " ); for ( int i = 0; i < n; i++) Console.Write(num[i] + " " ); } // Driver code public static void Main(String[] args) { int []arr = {13, 10, 14, 9, 17, 21, 16, 18, 13, 17}; // n is not size of array, but number of // elements whose pairwise sum is stored // in arr[] int n = 5; findNumbers(arr, n); } } // This code is contributed by parashar... |
PHP
<?php // PHP program to find n numbers // from given ordered pairwise // sum of them. // Note : n is not size // of array, but number of // elements whose pairwise // sum is stored in arr[] function findNumbers( $arr , $n ) { $num [ $n ]=0; // b-a is calculated here $b_minus_a = $arr [ $n - 1] - $arr [1]; // b is calculated here $num [1] = ( $arr [0] + $b_minus_a ) / 2; // a is calculated here $num [0] = $arr [0] - $num [1]; // to calculate all the other numbers for ( $i = 1; $i <= ( $n - 2); $i ++) $num [ $i + 1] = $arr [ $i ] - $num [0]; // display the numbers echo "Numbers are: " ; for ( $i = 0; $i < $n ; $i ++) echo $num [ $i ]. ", " ; } // Driver Code { $arr = array (13, 10, 14, 9, 17, 21, 16, 18, 13, 17); // n is not size of array, but number of // elements whose pairwise sum is stored // in arr[] $n = 5; findNumbers( $arr , $n ); return 0; } // This code is contributed by nitin mittal. ?> |
Javascript
<script> // javascript program to find n numbers from given // ordered pairwise sum of them. // Note : n is not size of array, but number // of elements whose pairwise sum is stored // in arr function findNumbers(arr , n) { var num = Array(n).fill(0); // b-a is calculated here var b_minus_a = arr[n - 1] - arr[1]; // b is calculated here num[1] = parseInt((arr[0] + b_minus_a) / 2); // a is calculated here num[0] = arr[0] - num[1]; // to calculate all the other numbers for (i = 1; i <= (n - 2); i++) num[i + 1] = arr[i] - num[0]; // display the numbers document.write( "Numbers are: " ); for (i = 0; i < n; i++) document.write(num[i] + " " ); } // Driver method var arr = [ 13, 10, 14, 9, 17, 21, 16, 18, 13, 17 ]; // n is not size of array, but number of // elements whose pairwise sum is stored // in arr var n = 5; findNumbers(arr, n); // This code contributed by umadevi9616 </script> |
Numbers are: 3 10 7 11 6
Time Complexity: O(n)
This article is contributed by Ayush Jauhari. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Login to comment...