Find the repeating and the missing number using two equations

Given an array arr[] of size N, each integer from the range [1, N] appears exactly once except A which appears twice and B which is missing. The task is to find the numbers A and B.

Examples:

Input: arr[] = {1, 2, 2, 3, 4}
Output:
A = 2
B = 5

Input: arr[] = {5, 3, 4, 1, 1}
Output:
A = 1
B = 2



Approach: From the sum of first N natural numbers,

SumN = 1 + 2 + 3 + … + N = (N * (N + 1)) / 2
And, let the sum of all the array elements be Sum. Now,
SumN = Sum – A + B
A – B = Sum – SumN …(equation 1)

And from the sum of the squares of first N natural numbers,

SumSqN = 12 + 22 + 32 + … + N2 = (N * (N + 1) * (2 * n + 1)) / 6
And, let the sum of the squares of all the array elements be SumSq. Now,
SumSq = SumSqN + A2 – B2
SumSq – SumSqN = (A + B) * (A – B) …(equation 2)

Put value of (A – B) from equation 1 in equation 2,

SumSq – SumSqN = (A + B) * (Sum – SumN)
A + B = (SumSq – SumSqN) / (Sum – SumN) …(equation 3)

Solving equation 1 and equation 3 will give,

B = (((SumSq – SumSqN) / (Sum – SumN)) + SumN – Sum) / 2
And, A = Sum – SumN + B

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 <cmath>
#include<bits/stdc++.h>
#include <iostream>
  
using namespace std;
  
    // Function to print the required numbers
 void findNumbers(int arr[], int n)
    {
  
        // Sum of first n natural numbers
        int sumN = (n * (n + 1)) / 2;
  
        // Sum of squares of first n natural numbers
        int sumSqN = (n * (n + 1) * (2 * n + 1)) / 6;
  
        // To store the sum and sum of squares
        // of the array elements
        int sum = 0, sumSq = 0, i;
  
        for (i = 0; i < n; i++) {
            sum += arr[i];
            sumSq = sumSq + (pow(arr[i], 2));
        }
  
        int B = (((sumSq - sumSqN) / (sum - sumN)) + sumN - sum) / 2;
        int A = sum - sumN + B;
         cout << "A = " ;
         cout << A << endl;
         cout << "B = " ;
         cout << B << endl;
    }
  
    // Driver code
int main() {
        int arr[] = { 1, 2, 2, 3, 4 };
        int n = sizeof(arr)/sizeof(arr[0]);
        findNumbers(arr, n);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
public class GFG {
  
    // Function to print the required numbers
    static void findNumbers(int arr[], int n)
    {
  
        // Sum of first n natural numbers
        int sumN = (n * (n + 1)) / 2;
  
        // Sum of squares of first n natural numbers
        int sumSqN = (n * (n + 1) * (2 * n + 1)) / 6;
  
        // To store the sum and sum of squares
        // of the array elements
        int sum = 0, sumSq = 0, i;
  
        for (i = 0; i < n; i++) {
            sum += arr[i];
            sumSq += Math.pow(arr[i], 2);
        }
  
        int B = (((sumSq - sumSqN) / (sum - sumN)) + sumN - sum) / 2;
        int A = sum - sumN + B;
        System.out.println("A = " + A + "\nB = " + B);
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 1, 2, 2, 3, 4 };
        int n = arr.length;
  
        findNumbers(arr, n);
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
  
import math
# Function to print the required numbers
def findNumbers(arr, n):
      
  
        # Sum of first n natural numbers
        sumN = (n * (n + 1)) / 2;
  
        # Sum of squares of first n natural numbers
        sumSqN = (n * (n + 1) * (2 * n + 1)) / 6;
  
        # To store the sum and sum of squares
        # of the array elements
        sum = 0;
        sumSq = 0;
  
        for i in range(0,n): 
            sum = sum + arr[i];
            sumSq = sumSq + (math.pow(arr[i], 2));
          
  
        B = (((sumSq - sumSqN) / (sum - sumN)) + sumN - sum) / 2;
        A = sum - sumN + B;
        print("A = ",int(A)) ;
        print("B = ",int(B));
      
  
# Driver code
  
arr = [ 1, 2, 2, 3, 4 ];
n = len(arr);
findNumbers(arr, n);
  
#This code is contributed by Shivi_Aggarwal 

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach 
using System;
public class GFG { 
  
    // Function to print the required numbers 
    static void findNumbers(int []arr, int n) 
    
  
        // Sum of first n natural numbers 
        int sumN = (n * (n + 1)) / 2; 
  
        // Sum of squares of first n natural numbers 
        int sumSqN = (n * (n + 1) * (2 * n + 1)) / 6; 
  
        // To store the sum and sum of squares 
        // of the array elements 
        int sum = 0, sumSq = 0, i; 
  
        for (i = 0; i < n; i++) { 
            sum += arr[i]; 
            sumSq += (int)Math.Pow(arr[i], 2); 
        
  
        int B = (((sumSq - sumSqN) / (sum - sumN)) + sumN - sum) / 2; 
        int A = sum - sumN + B; 
        Console.WriteLine("A = " + A + "\nB = " + B); 
    
  
    // Driver code 
    public static void Main() 
    
        int []arr = { 1, 2, 2, 3, 4 }; 
        int n = arr.Length; 
  
        findNumbers(arr, n); 
    
// This code is contributed by PrinciRaj1992

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the approach
  
// Function to print the required numbers 
function findNumbers($arr, $n
  
    // Sum of first n natural numbers 
    $sumN = ($n * ($n + 1)) / 2; 
  
    // Sum of squares of first n 
    // natural numbers 
    $sumSqN = ($n * ($n + 1) * 
                (2 * $n + 1)) / 6; 
  
    // To store the sum and sum of
    // squares of the array elements 
    $sum = 0 ;
    $sumSq = 0 ;
  
    for ($i = 0; $i < $n; $i++) 
    
        $sum += $arr[$i]; 
        $sumSq += pow($arr[$i], 2); 
    
  
    $B = ((($sumSq - $sumSqN) / ($sum - $sumN)) + 
                                 $sumN - $sum) / 2; 
    $A = $sum - $sumN + $B
    echo "A = ", $A, "\nB = ", $B;
  
// Driver code 
$arr = array( 1, 2, 2, 3, 4 );
$n = sizeof($arr) ; 
  
findNumbers($arr, $n); 
  
// This code is contributed by Ryuga
?>

chevron_right


Output:

A = 2
B = 5


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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.