Fork me on GitHub

平均数三种境界


前言

平均数:平均数是指在一组数据中所有数据之和再除以数据的个数。平均数是表示一组数据集中趋势的量数,它是反映数据集中趋势的一项指标。今天就简单讲解一下编程界平均数几种简要解法。

解法一:

这种方法最为简单,弊端是如果a和b非常大的话,a+b的值可能超过了整型的储存范围(最大值为2147483647),导致溢出,得到错误的结果。

  • 参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>  
int main()
{
int a=10;

int b=20;

int avg=0;

avg=(a+b)/2;//平局值

//或者
avg=(a+b)>>1://右移表示除2,左移表示乘2。

//【-1除外】(右移一位为-1,左移一位为-2)
printf("%d\n",avg);
return 0;
}

解法二:

用一个较大值减去另一个较小值得到二者之差,将差除2后加上较小值即得到了二者平均值,可有效防止溢出的情况的出现。

步骤如图:

图片加载

  • 参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>  
int main()
{
int a=10;

int b=20;

int avg=0;

avg=b+(a-b)/2;//平均值

//或者
avg=b+(a-b)>>1://右移表示除2,左移表示乘2

//【-1除外】(右移一位为-1,左移一位为-2)
printf("%d\n",avg);
return 0;
}

方法三:

将两个数的二进制位分为相同部分和不同部分,利用按位与求出相同部分的平均数,然后再用按位异或求出不同部分的平均数,加起来就是两个数的平均数。

这里举个栗子:

  • a = 10,b = 12;
  • 10&12可得到 1000
  • 10^12可得到 0110
    计算a与b的平均值C语言表达式:
  • avg = (a&b) + (a^b)>>1
  • 参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>  
int main()
{
int a=10;

int b=20;

int avg=0;

avg = (a&b) + (a^b)>>1;

//或者
avg = (a&b) + (a^b)/2;
printf("%d\n",avg);
return 0;
}

结语

知识在于汇总,方法在于总结。
不忘初心,励志前行!

-------------本文结束感谢您的阅读-------------