(a+b)/2这种方式求平均数时,假如两个数过大的话极易发生溢出现象, 我们一般都会通过这种方式来避免溢出:
#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996
int Ave(int a, int b)
{
int ret = 0;
int res = 0;
a > b ? a : b;
ret = (a - b) / 2;
res = b + ret;
return res;
}
int main()
{
int a = 0;
int b = 0;
printf("Please input two number:");
scanf("%d %d", &a, &b);
int ave = Ave(a, b);
printf("%d\n", ave);
system("pause");
return 0;
}
2.我们知道,二进制数右移一位就相对于除于2.(a+b)>>2就相当于(a+b)/2。
#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)
int Ave(int a, int b)
{
int ret = 0;
ret = (a + b) >> 1;
return ret;
}
int main()
{
int a = 0;
int b = 0;
printf("Please input two number:");
scanf("%d %d", &a, &b);
int ave = Ave(a, b);
printf("%d\n", ave);
system("pause");
return 0;
}
3.看上图,俩个数字相同的部分为a&b,不同的部分为a^b,要他们值相同的时候就是用相同的部分加上不同的部分的1/2.
#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996
int Ave(int a, int b)
{
int ret = 0;
ret = (a & b) + ((a ^ b) >> 1);
return ret;
}
int main()
{
int a = 0;
int b = 0;
printf("Please input two number:");
scanf("%d %d", &a, &b);
int ave = Ave(a, b);
printf("%d\n", ave);
system("pause");
return 0;
}