给定n个数字的成对和,找到数字
按指定顺序给出 n(其中 n >= 3)数字的成对和,找出这些数字。该订单具有第一和第二的对和,然后是第一和第三,第一和第四,......第二和第三,第二和第四,..等等。考虑一个例子:n = 4,设数字为 {a, b, c, d},它们的成对和按 arr[] = {a+b, a+c, a+d, b+c 的顺序给出, b+d, c+d}。
例子:
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}
在亚马逊上问
方法纯粹基于数学,如下图所示:
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
下面是上述想法的实现。
C++
// C++ program to find n numbers from given ordered
// pairwise sum of them.
#include
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
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
Javascript
输出:
Numbers are: 3, 10, 7, 11, 6