思维训练题,再继续加油!

试图不用if-else语句和任何比较,求出两个数的最大值?
思维训练题,再继续加油!_第1张图片

不考虑a,b的正负性,仅仅记录 k= a/b,而后构造:k*a+!k *b就可以了。但是如果是任意两个整数呢?
有人给出思路:二者之差的绝对值,再加上a+b,就得出最大值。由于不知道C语言库函数是如何定义abs函数的,如果用了比较的方法,这个思路表面看似正确,实际可能偏离了要求。
在观察leetcode这道题目下大佬们的方法,和题目的提示,我融会贯通,学会了一种新的方法。

首先明确一点,计算机中int型整数,负数移位31为-1(至于为什么不是1可以自行百度哟),正数移位31为0;
长整型63位同理.
为防止a-b溢出,我们用长整型表示a和b,再对a和b的差进行移位运算,其要么是-1要么是0,则恰好可以通过加上1,变成a-b>0的逻辑真与逻辑假。再根据题目中隐藏提示2,设计函数得出二者最大值。

int maximum(int a, int b){
     
        long c = a;
        long d = b;
        int k;
        k=1+((c-d)>>63);
        return k*a+(!k)*b;
}

效果还行:
思维训练题,再继续加油!_第2张图片大家都继续加油,comrades,晚安!

你可能感兴趣的:(算法,c语言)