📜  计算两个数字的平均值而不会溢出

📅  最后修改于: 2021-04-27 09:44:13             🧑  作者: Mango

给定两个数字,a和b。计算两个数字的平均值。
在以下情况下,众所周知的公式(a + b)/ 2可能会失败:
如果, a = b =(2 ^ 31)– 1 ;即INT_MAX。
现在,(a + b)将导致溢出,因此公式(a + b)/ 2将不起作用
下面是实现:

C++
// C++ code to compute average of two numbers
#include 
using namespace std;
 
// Function to compute average of two numbers
int compute_average(int a, int b)
{
    return (a + b) / 2;
}
 
// Driver code
int main()
{
    // Assigning maximum integer value
    int a = INT_MAX, b = INT_MAX;
 
    // Average of two equal numbers is the same number
    cout << "Actual average : " << INT_MAX << endl;
 
    // Function to get the average of 2 numbers
    cout << "Computed average : " << compute_average(a, b);
 
    return 0;
}


Java
// Java code to compute average of two numbers
 
import java.io.*;
 
class GFG {
     
// Function to compute average of two numbers
static int compute_average(int a, int b)
{
    return (a + b) / 2;
}
 
// Driver code
    public static void main (String[] args) {
 
    // Assigning maximum integer value
    int a = Integer.MAX_VALUE;
    int b = Integer.MAX_VALUE;
 
    // Average of two equal numbers is the same number
    System.out.println("Actual average : " + Integer.MAX_VALUE);
 
    // Function to get the average of 2 numbers
    System.out.println("Computed average : " + compute_average(a, b));
         
         
    }
// This code is contributed by ajit.   
}


Python3
# Python 3 code to compute
# average of two numbers
import sys
from math import floor
 
INT_MAX = 2147483647
 
# Function to compute
# average of two numbers
def compute_average(a, b):
    return floor((a + b) / 2)
 
# Driver code
if __name__ == '__main__':
     
    # Assigning maximum integer value
    a = INT_MAX
    b = -INT_MAX - 1
 
    # Average of two equal numbers
    # is the same number
    print("Actual average : ", INT_MAX)
 
    # Function to get the
    # average of 2 numbers
    print("Computed average : ",
           compute_average(a, b))
 
# This code is contributed by
# Surendra_Gangwar


C#
// C#  code to compute average of two numbers
using System;
 
public class GFG{
         
// Function to compute average of two numbers
static int compute_average(int a, int b)
{
    return (a + b) / 2;
}
 
// Driver code
    static public void Main (){
         
    // Assigning maximum integer value
    int a =int.MaxValue;
    int b = int.MaxValue;
 
    // Average of two equal numbers is the same number
    Console.WriteLine("Actual average : " + int.MaxValue);
 
    // Function to get the average of 2 numbers
    Console.WriteLine("Computed average : " + compute_average(a, b));
    }
//This code is contributed by akt_mit   
}


C++
// C++ code to compute average of two numbers
#include 
using namespace std;
 
// Function to compute average of two numbers
int compute_average(int a, int b)
{
    return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
 
// Driver code
int main()
{
    // Assigning maximum integer value
    int a = INT_MAX, b = INT_MAX;
 
    // Average of two equal numbers is the same number
    cout << "Actual average : " << INT_MAX << endl;
 
    // Function to get the average of 2 numbers
    cout << "Computed average : " << compute_average(a, b);
 
    return 0;
}


Java
// Java code to compute
// average of two numbers
import java.io.*;
 
class GFG
{
     
// Function to compute
// average of two numbers
static int compute_average(int a,
                           int b)
{
    return (a / 2) + (b / 2) +
           ((a % 2 + b % 2) / 2);
}
 
// Driver code
public static void main (String[] args)
{
 
// Assigning maximum
// integer value
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
 
// Average of two equal
// numbers is the same number
System.out.println("Actual average : " +
                     Integer.MAX_VALUE);
 
// Function to get the
// average of 2 numbers
System.out.print("Computed average : ");
System.out.println(compute_average(a, b));
}
}
 
// This code is contributed by ajit


Python3
# Python code to compute
# average of two numbers
INT_MAX=2147483647
 
# Function to compute
# average of two numbers
def compute_average(a,b):
 
    return (a // 2) + (b // 2) + ((a % 2 + b % 2) // 2)
 
# Driver code
if __name__ =="__main__":
    # Assigning maximum integer value
    a = INT_MAX
    b = INT_MAX
 
    # Average of two equal
    # numbers is the same number
    print( "Actual average : ",INT_MAX)
 
    # Function to get the
    # average of 2 numbers
    print( "Computed average : ",
            compute_average(a, b))
 
     
# This code is contributed
# Shubham Singh(SHUBHAMSINGH10)


C#
// C# code to compute
// average of two numbers
 
using System;
  
class GFG
{
      
// Function to compute
// average of two numbers
static int compute_average(int a,
                           int b)
{
    return (a / 2) + (b / 2) +
           ((a % 2 + b % 2) / 2);
}
  
// Driver code
public static void Main ()
{
  
// Assigning maximum
// integer value
int a = int.MaxValue;
int b = int.MaxValue;
  
// Average of two equal
// numbers is the same number
Console.Write("Actual average : " +
                     int.MaxValue+"\n");
  
// Function to get the
// average of 2 numbers
Console.Write("Computed average : ");
Console.Write(compute_average(a, b));
}
}


PHP


Javascript


输出:

Actual average : 2147483647
Computed average : -1

改进的公式,不会引起溢出:
平均值=(a / 2)+(b / 2)+((((a%2)+(b%2))/ 2)
下面是实现:

C++

// C++ code to compute average of two numbers
#include 
using namespace std;
 
// Function to compute average of two numbers
int compute_average(int a, int b)
{
    return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
 
// Driver code
int main()
{
    // Assigning maximum integer value
    int a = INT_MAX, b = INT_MAX;
 
    // Average of two equal numbers is the same number
    cout << "Actual average : " << INT_MAX << endl;
 
    // Function to get the average of 2 numbers
    cout << "Computed average : " << compute_average(a, b);
 
    return 0;
}

Java

// Java code to compute
// average of two numbers
import java.io.*;
 
class GFG
{
     
// Function to compute
// average of two numbers
static int compute_average(int a,
                           int b)
{
    return (a / 2) + (b / 2) +
           ((a % 2 + b % 2) / 2);
}
 
// Driver code
public static void main (String[] args)
{
 
// Assigning maximum
// integer value
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
 
// Average of two equal
// numbers is the same number
System.out.println("Actual average : " +
                     Integer.MAX_VALUE);
 
// Function to get the
// average of 2 numbers
System.out.print("Computed average : ");
System.out.println(compute_average(a, b));
}
}
 
// This code is contributed by ajit

Python3

# Python code to compute
# average of two numbers
INT_MAX=2147483647
 
# Function to compute
# average of two numbers
def compute_average(a,b):
 
    return (a // 2) + (b // 2) + ((a % 2 + b % 2) // 2)
 
# Driver code
if __name__ =="__main__":
    # Assigning maximum integer value
    a = INT_MAX
    b = INT_MAX
 
    # Average of two equal
    # numbers is the same number
    print( "Actual average : ",INT_MAX)
 
    # Function to get the
    # average of 2 numbers
    print( "Computed average : ",
            compute_average(a, b))
 
     
# This code is contributed
# Shubham Singh(SHUBHAMSINGH10)

C#

// C# code to compute
// average of two numbers
 
using System;
  
class GFG
{
      
// Function to compute
// average of two numbers
static int compute_average(int a,
                           int b)
{
    return (a / 2) + (b / 2) +
           ((a % 2 + b % 2) / 2);
}
  
// Driver code
public static void Main ()
{
  
// Assigning maximum
// integer value
int a = int.MaxValue;
int b = int.MaxValue;
  
// Average of two equal
// numbers is the same number
Console.Write("Actual average : " +
                     int.MaxValue+"\n");
  
// Function to get the
// average of 2 numbers
Console.Write("Computed average : ");
Console.Write(compute_average(a, b));
}
}

的PHP


Java脚本


输出:

Actual average : 2147483647
Computed average : 2147483647