求平均数的几种方法
2017-10-18 16:24
113 查看
平均数:给定两个数a和b,求其平均值;
分析:数学运算中一贯的算法是(a+b)/2,但在c语言中这种算法存在着一定的缺陷,当a和b足够大时,a和b的和就会存在溢出,从而得不到我们想要的结果。c语言中有相应的操作符可达到求平均数的效果,例如:>>(右移),&按为与,^(按位异或)。
1、存在缺陷的算法(a+b)/2
例:
输出的结果为-1;此时,a和b的和为2147483647的2倍,但是编译器中所存放的最大数为2147483647,故发生了溢出,输出的结果为-1。
2、a+(b-a)/2
例:
int main()
{
int a=2147483647,b=2147483647;
/*int a=2,b=4;*/
int ret=0;
ret=a+(b-a)/2;
printf("a+b=%d\n",ret);
return 0;
}
这个程序首先将b与a的差值求出并且除以2,在加上a;这样的算法保证了程序在运算过程中不会发生溢出现象。即使当a和b的值较大时,也会求得平均数。
3、运用>>右移操作符
例:
int main()
{
int a=2,b=4;
int ret=0;
ret=(a+b)>>1;
printf("a+b=%d\n",ret);
return 0;
} 此程序利用左移操作符来达到除2的目的以此来求得a和b的平均数。右移操作符是将一个数的所有位向右移动若干位,在这里我们将a和b的和向右移动1位,其高位来到低位,从而达到除2的目的。来看一下实现过程:
3、运用 & 按位与和 >> 按位异或
例:
int main()
{
int a=2,b=4;
int ret=0;
ret=(a&b)+((a^b)>>1);
printf("a+b=%d\n",ret);
return 0;
}
按位与操作符规律为:两数的二进制位,相同为1,不同为0。此时按位与的结果可将相同的二进制位留下,不同二进制位置0,达到相同二进制位相加除2的结果;按位异或操作符:两数的二进制位,不同为1,相同为0。此时按位异或的结果将不同的二进制位留下,相同二进制位置0,并且右移1位,达到不同二进制位相加除2的结果。实现过程:
运行结果:
分析:数学运算中一贯的算法是(a+b)/2,但在c语言中这种算法存在着一定的缺陷,当a和b足够大时,a和b的和就会存在溢出,从而得不到我们想要的结果。c语言中有相应的操作符可达到求平均数的效果,例如:>>(右移),&按为与,^(按位异或)。
1、存在缺陷的算法(a+b)/2
例:
int main() { int a=4,b=2; int ret=0; ret=(a+b)/2; printf("a+b=%d\n",ret); return 0; }这个程序运行的结果是3,没有问题,满足数学运算里面求平均数的算法,但当我们将a和b的赋值为2147483647,
输出的结果为-1;此时,a和b的和为2147483647的2倍,但是编译器中所存放的最大数为2147483647,故发生了溢出,输出的结果为-1。
2、a+(b-a)/2
例:
int main()
{
int a=2147483647,b=2147483647;
/*int a=2,b=4;*/
int ret=0;
ret=a+(b-a)/2;
printf("a+b=%d\n",ret);
return 0;
}
这个程序首先将b与a的差值求出并且除以2,在加上a;这样的算法保证了程序在运算过程中不会发生溢出现象。即使当a和b的值较大时,也会求得平均数。
3、运用>>右移操作符
例:
int main()
{
int a=2,b=4;
int ret=0;
ret=(a+b)>>1;
printf("a+b=%d\n",ret);
return 0;
} 此程序利用左移操作符来达到除2的目的以此来求得a和b的平均数。右移操作符是将一个数的所有位向右移动若干位,在这里我们将a和b的和向右移动1位,其高位来到低位,从而达到除2的目的。来看一下实现过程:
3、运用 & 按位与和 >> 按位异或
例:
int main()
{
int a=2,b=4;
int ret=0;
ret=(a&b)+((a^b)>>1);
printf("a+b=%d\n",ret);
return 0;
}
按位与操作符规律为:两数的二进制位,相同为1,不同为0。此时按位与的结果可将相同的二进制位留下,不同二进制位置0,达到相同二进制位相加除2的结果;按位异或操作符:两数的二进制位,不同为1,相同为0。此时按位异或的结果将不同的二进制位留下,相同二进制位置0,并且右移1位,达到不同二进制位相加除2的结果。实现过程:
运行结果:
相关文章推荐
- asp.net 多语言几种方法
- ubuntu11.04安装opencv2.2的几种方法的比较 转
- 调用接口获取接口返回信息的几种工具方法
- 内存管理的几种方法
- 【mysql数据导入】数据导入时的几种方法
- 几种数据加密方法
- android 给组件添加事件的几种方法
- C++读取配置文件的几种方法
- java加载properties配置文件的几种方法
- JAVA关于获得当前时间的几种处理方法
- VC编写DLL几种方法的简介
- 让进程在后台可靠运行的几种方法
- javascript几种写空格符的方法
- strlen函数实现的几种方法
- Android-系统换肤的几种方法
- Android 几种发送短信的方法
- Android实现计时与倒计时(限时抢购)的几种方法
- ASP.NET实现页面间值传递的几种方法
- java读取配置文件的几种方法
- Android Studio导入项目的几种方法