Program for average of an array without running into overflow - GeeksforGeeks

15 Jun, 2021
Given an array arr[] of size N, the task is to find the average of the array elements without running into overflow.
Examples:
Input: arr[] = { INT_MAX, INT_MAX }Output:Average by Standard method: -1.0000000000Average by Efficient method: 2147483647.0000000000Explanation: The average of the two numbers by standard method is (sum / 2).Since the sum of the two numbers exceed INT_MAX, the obtained output by standard method is incorrect.
Input: arr[] = { INT_MAX, 1, 2 }Output:Average by Standard method: -715827882.0000000000Average by Efficient method: 715827883.3333332539
Approach: The given problem can be solved based on the following observations: 
The average of N array elements can be obtained by dividing the sum of the array elements by N. But, calculating sum of the array arr[] may lead to integer overflow, if the array contains large integers.
Therefore, average of the the array can be calculated efficiently by the following steps:Traverse the array, using a variable i over the range of indices [0, N – 1] Update avg = (avg+ (arr[i] – avg)/(i+1))
Traverse the array, using a variable i over the range of indices [0, N – 1] 
Update avg = (avg+ (arr[i] – avg)/(i+1))
Follow the steps below to solve the problem:
Initialize two variables, say sum as 0 and avg as 0, to store the sum and average of the array elements respectively.
Traverse the array arr[], update avg = avg + (arr[i] – avg) / (i + 1) and update sum = sum + arr[i].
After completing the above steps, print the average by the standard method, i.e. sum / N and print the average by the efficient method, i.e. avg
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to calculate average of// an array using standard methoddouble average(int arr[], int N){    // Stores the sum of array    int sum = 0;     // Find the sum of the array    for (int i = 0; i < N; i++)        sum += arr[i];     // Return the average    return (double)sum / N;} // Function to calculate average of// an array using efficient methoddouble mean(int arr[], int N){    // Store the average of the array    double avg = 0;     // Traverse the array arr[]    for (int i = 0; i < N; i++) {         // Update avg        avg += (arr[i] - avg) / (i + 1);    }     // Return avg    return avg;} // Driver Codeint main(){    // Input    int arr[] = { INT_MAX, 1, 2 };    int N = sizeof(arr) / sizeof(arr[0]);     // Function call    cout << "Average by Standard method: " << fixed         << setprecision(10) << average(arr, N) << endl;     cout << "Average by Efficient method: " << fixed         << setprecision(10) << mean(arr, N) << endl;     return 0;}
// Java program for the above approachimport java.util.*;class GFG{  // Function to calculate average of// an array using standard methodstatic Double average(int arr[], int N){       // Stores the sum of array    int sum = 0;     // Find the sum of the array    for (int i = 0; i < N; i++)        sum += arr[i];     // Return the average    return Double.valueOf(sum / N);} // Function to calculate average of// an array using efficient methodstatic Double mean(int arr[], int N){       // Store the average of the array    Double avg = 0.0;     // Traverse the array arr[]    for (int i = 0; i < N; i++)    {         // Update avg        avg += Double.valueOf((arr[i] - avg) / (i + 1));    }     // Return avg    return avg;} // Driver Codepublic static void main(String args[]){       // Input    int arr[] = {Integer.MAX_VALUE, 1, 2 };    int N = arr.length;       // Function call    System.out.println("Average by Standard method: "+ String.format("%.10f", average(arr, N)));    System.out.println("Average by Efficient method: "+ String.format("%.10f", mean(arr, N)));}} // This code is contributed by ipg2016107.
# Python3 program for the above approachimport sys # Function to calculate average of# an array using standard methoddef average(arr, N):         # Stores the sum of array    sum = 0     # Find the sum of the array    for i in range(N):        sum += arr[i]     # Return the average    return sum // N * 1.0 - 1 # Function to calculate average of# an array using efficient methoddef mean(arr, N):         # Store the average of the array    avg = 0     # Traverse the array arr[]    for i in range(N):                 # Update avg        avg += (arr[i] - avg) / (i + 1)     # Return avg    return round(avg, 7) # Driver Codeif __name__ == '__main__':         # Input    arr = [2147483647, 1, 2]    N = len(arr)     # Function call    print("Average by Standard method: ","{:.10f}".format(        -1.0 * average(arr, N)))     print("Average by Efficient method: ","{:.10f}".format(        mean(arr, N))) # This code is contributed by mohit kumar 29
// C# program for the above approachusing System; class GFG{ // Function to calculate average of// an array using standard methodstatic double average(int[] arr, int N){         // Stores the sum of array    int sum = 0;     // Find the sum of the array    for(int i = 0; i < N; i++)        sum += arr[i];     // Return the average    return (double)(sum / N);} // Function to calculate average of// an array using efficient methodstatic double mean(int[] arr, int N){     // Store the average of the array    double avg = 0.0;     // Traverse the array arr[]    for(int i = 0; i < N; i++)    {                 // Update avg        avg += ((double)((arr[i] - avg) / (i + 1)));    }     // Return avg    return avg;} // Driver Codestatic public void Main(){     // Input    int[] arr = { Int32.MaxValue, 1, 2 };    int N = arr.Length;     // Function call    Console.WriteLine("Average by Standard method: " +         (average(arr, N)).ToString("F10"));    Console.WriteLine("Average by Efficient method: " +         (mean(arr, N)).ToString("F10"));}} // This code is contributed by Dharanendra L V.
<script> // Javascript program for the above approach // Function to calculate average of// an array using standard methodfunction average(arr, N){    // Stores the sum of array    var sum = 0;     // Find the sum of the array    for(var i = 0; i < N; i++)        sum += arr[i];     if(sum>2147483647)    {        sum = -2147483647 + (sum - 2147483649)    }     // Return the average    return parseInt(sum / N);} // Function to calculate average of// an array using efficient methodfunction mean(arr, N){    // Store the average of the array    var avg = 0;     // Traverse the array arr[]    for(var i = 0; i < N; i++) {         // Update avg        avg += parseFloat((arr[i] - avg) / (i + 1));    }     // Return avg    return avg;} // Driver Code// Inputvar arr = [2147483647, 1, 2 ];var N = arr.length// Function calldocument.write( "Average by Standard method: " + average(arr, N).toFixed(10) + "<br>");document.write( "Average by Efficient method: " + mean(arr, N).toFixed(10)+ "<br>"); </script>
Average by Standard method: -715827882.0000000000
Average by Efficient method: 715827883.3333332539
 
Time Complexity: O(N)Auxiliary Space: O(1)
 
ipg2016107
dharanendralv23
mohit kumar 29
famously
maths-mean
Arrays
Mathematical
Arrays
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Arrays
Multidimensional Arrays in Java
Linked List vs Array
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Python | Using 2D arrays/lists the right way
Program for Fibonacci numbers
Write a program to print all permutations of a given string
Set in C++ Standard Template Library (STL)
C++ Data Types
Coin Change | DP-7