母公司与子公司的债务:很有意思的编程,挑战高手

来源:百度文库 编辑:高校问答 时间:2024/05/04 13:22:55
问题:There are two int variables: a and b, don’t use “if”, “? :”, “switch”
or other judgement statements, find out the biggest one of the two
numbers.
请大家给出答案,还要求在小数。
注意:
a,b可能为零

还要求最小数(我对问题的引申)。
要输出最大数啊。
我遇到的一个问题,无处下手。

楼上思路对,但是实现不对,正确实现如下:
#include <stdio.h>

int max( int a, int b )
{
return ((unsigned)(b-a)>>(sizeof(int)*8-1))*(a-b)+b;
}

int min( int a, int b )
{
return ((unsigned)(a-b)>>(sizeof(int)*8-1))*(a-b)+b;
}

int main()
{
printf("%d %d\n", min(3,5), max(3,5));
return 0;
}

程序输出:
3 5

“还要求在小数”是什么意思?

我的解答:

int max( int a, int b )
{
return (a-b)>>(sizeof(int)*8-1)*(a-b)+b;
}

即用(a-b)的最高位是1还是0

另外,我觉得不能用abs等函数,因为该函数中有if,如果允许用函数的话,那还不如直接用max函数呢

补充回答:
楼主仔细瞧了--------
我的答案输出的就是最大数啊~
如果a>b的话,(a-b)>0
(a-b)>>(sizeof(int)*8-1)就是(a-b)的最高位
也就是1
这样return的就是1*(a-b)+b=a
如果a<b,(a-b)>>(sizeof(int)*8-1)就是0
这样return的就是0*(a-b)+b=b

最小数同理可得:
int min( int a, int b )
{
return (b-a)>>(sizeof(int)*8-1)*(a-b)+b;
}

可以用<、>号吗???
如果可以,直接就
最大数
return (a>b)*a+(b>a)*b;
最小数
return (a>b)*b+(b>a)*a;
因为在c中,T会转换为1,F会转换为0。

是只要明白就行了不?

int main()
{
int a,b,c;
……
c=a-b;
cout<<c;
}

就是定义一个和a,b相同类型有符号的变量c.
把a-b的值赋给c,在屏幕显示c,是负数就是a小于b
是正数就是a大于b

最小 (a/b)*b + (b/a)*a
最大 a + b - (a/b)*b - (b/a)*a