以下五种方法分别求出较大的数和较小的数的方法。较小数的代码在注释中,但未运行测试。
int Find1(int a, int b) {
return ((a + b) + abs(a - b)) / 2;
//return ((a + b) - abs(a - b)) / 2;
}
/*
当a大于b时,a-b为正,右移sizeof(int) * 8 - 1后,最右侧一位为0,0^1 = 0;
当a小于b时,a-b为负,右移后最右侧一位为1,1^1 = 1
*/
int Find21(int a, int b) {
int c[2] = {a, b};
int z = a - b;
z = (z >> (sizeof(int) * 8 - 1)) & 1;
return c[z];
/*
int c[2] = {b, a};
int z = a - b;
z = (z >> (sizeof(int) * 8 - 1)) & 1;
return c[z];
*/
}
int Find22(int a, int b) {
int flag = ((a - b) >> (sizeof(int) * 8 - 1)) & 1;
return (a - (a - b) * flag);
//return (b - (b - a) * flag);
}
int Find3(int a, int b) {
int c[2] = {a, b};
return c[a < b];
//return c[a > b];
}
/*
该方法对于两个数均为负数的情况以及有数为0的情况
没法处理,但这里也列出该方法。
a<b时,a/b=0,所以被除数为b*(b/a),除数为b/a,结果是b
a=b时,a/b=1,所以被除数为a+b=2a,除数为2,结果是a
a>b时,b/a=0,所以被除数为a*(a/b),除数为a/b,结果是a
*/
int Find4(int a, int b)
{
int larger = (a*(a/b) + b*(b/a))/(a/b + b/a);
//long smaller = (b*(a/b) + a*(b/a))/(a/b + b/a);
return larger;
}
int main() {
int a, b;
while (1) {
cin >> a >> b;
cout << Find1(a, b) << " ";
cout << Find21(a, b) << " ";
cout << Find22(a, b) << " ";
cout << Find3(a, b) << " ";
cout << Find4(a, b) << endl;
}
}