不使用if、?:、switch表达式求整数a、b两数中的较大值

对于这个题其实还可以加点要求:不使用< > <= >= 这四种判断表达式。否则可以直接简单的求解:

int c;
while(a > b)
{
    c = a;
    goto end;
}
c = b;
end:
print(c);

我想题目的本意不是这样的,那么不准使用< > <= >=如何求解呢?既然题目要求if、问好表达式、switch都不能使用,编程语言里面这几种结构还有什么?for、while是最先能想到的,我准备用while试一试,先做下面这个操作:

int a1 = a,b1 = b;
while(a1 && b1)
{
    a1--;
    b1--;
}

上面的程序执行完成之后我们得到a1和b1,a1+b1的值就是a和b的差值的绝对值,如果a>b,那么a1=a-b,b1=0,如果a<b,那么a1=0,b1=b-a。现在有a1、b1以及a1+b1这三个数据可以利用了。我们现在可以知道a和b的和a+b,想要求出a和b中的较大值,就需要从a+b中减去较小值,我们可以使用多项式表达一下这个关系:

max = (a+b) - α*a -  β*b;若a>b,则α=0,β=1,若a<b,则α=1,β=0,恰巧我们使用a1、b1、a1+b1就可以实现α、β,如下公式所示:

其中α为,若a>b,那么α=0,否则α=1。或者使用更简单的一种方式:

其中以第二项为例,a1要么等于0要么等于a、b差值的绝对值,那么β的值为0或者1,α的值也是一样的。

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值